2016-10-02 1 views
1

enter image description hereComment puis-je mettre l'étiquette sous le bouton radio dans un panneau avec Java Swing/AWT

Il y a 3 panneaux que j'ai créé comme on le voit dans l'image. Le premier panneau est le panneau "De", le second est "À", et le troisième est le panneau des boutons. Donc la question est, comment puis-je mettre une nouvelle ligne pour le "Enter Temperature: []" afin qu'il soit sous les boutons radio? Je suis très nouveau à Java swing/awt s'il vous plaît ours avec moi.

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 
import java.awt.*; 

public class TemperatureConversion extends JFrame{ 

// component 
JTextField txtFromTemp, txtToTemp; 
JLabel lblFromTemp, lblToTemp; 
JRadioButton radFromCelsius, radFromFahrenheit, radFromKelvin; 
JRadioButton radToCelsius, radToFahrenheit, radToKelvin;  
JPanel pnlFromRadioButton, pnlToRadioButton, pnlFromTemp, pnlButton; 
ButtonGroup bgFrom, bgTo; 
JButton btnConvert, btnExit; 

// constructor 
public TemperatureConversion(){ 
    super("Temperature"); 

    // assign objects 
    radFromCelsius = new JRadioButton("Celsius", true); 
    radFromFahrenheit = new JRadioButton("Fahrenheit"); 
    radFromKelvin = new JRadioButton("Kelvin"); 
    lblFromTemp = new JLabel("Enter Temperature: "); 
    pnlFromTemp = new JPanel(); 
    btnConvert = new JButton("Convert"); 
    btnExit = new JButton("Exit"); 
    pnlButton = new JPanel(); 
    txtFromTemp = new JTextField(3); 
    lblToTemp = new JLabel("Comparable Temperature: "); 
    txtToTemp = new JTextField(3); 


    // register the button to a listener 
    btnExit.addActionListener(new MyButtonListener()); 
    btnConvert.addActionListener(new MyButtonListener()); 


    // make the multiple choice exclusive but not a container 
    bgFrom = new ButtonGroup(); 
    bgFrom.add(radFromCelsius); 
    bgFrom.add(radFromFahrenheit); 
    bgFrom.add(radFromKelvin); 

    // radio buttons 
    radToCelsius = new JRadioButton("Celsius"); 
    radToFahrenheit = new JRadioButton("Fahrenheit", true); 
    radToKelvin = new JRadioButton("Kelvin"); 

    // make the multiple choice exclusive 
    bgTo = new ButtonGroup(); 
    bgTo.add(radToCelsius); 
    bgTo.add(radToFahrenheit); 
    bgTo.add(radToKelvin); 


    pnlFromRadioButton = new JPanel(); 
    pnlToRadioButton = new JPanel(); 

    // decorate the panel 
    pnlFromRadioButton.setBorder(BorderFactory.createTitledBorder("From")); 
    pnlToRadioButton.setBorder(BorderFactory.createTitledBorder("To")); 

    // add radiobutton to panel 
    pnlFromRadioButton.add(radFromCelsius); 
    pnlFromRadioButton.add(radFromFahrenheit); 
    pnlFromRadioButton.add(radFromKelvin); 
    pnlToRadioButton.add(radToCelsius); 
    pnlToRadioButton.add(radToFahrenheit); 
    pnlToRadioButton.add(radToKelvin); 

    // add button to panel 
    pnlButton.add(btnConvert); 
    pnlButton.add(btnExit); 

    // add label and txt field to panel 
    pnlFromRadioButton.add(lblFromTemp); 
    pnlFromRadioButton.add(txtFromTemp); 
    pnlToRadioButton.add(lblToTemp); 
    txtToTemp.setEditable(false); 
    pnlToRadioButton.add(txtToTemp); 


    // add panels to the frame 
    add(pnlFromRadioButton, BorderLayout.NORTH); 
    add(pnlToRadioButton, BorderLayout.CENTER); 
    add(pnlButton, BorderLayout.SOUTH); 


    setVisible(true); 
    setSize(400, 300); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    pack(); 
} 


// private inner class to handle button event 
private class MyButtonListener implements ActionListener { 
    // must override actionPerformed method 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == btnConvert) { 
      if (radFromCelsius.isSelected()) 
      System.out.print("exit"); 
     } else if (e.getSource() == btnExit) { 
      System.exit(0); 
     } 
    } 
} 


public static void main(String[] args) { 
    new TemperatureConversion(); 
} 

} 
+0

Voulez-vous 'Enter Temperature: []' pour afficher sous les boutons radio From? – c0der

+0

Oui @ c0der. Je le veux pour cela et aussi la température comparable: [] pour montrer sous les boutons radio À. – Ojouk

Répondre

2

Nest plus JPanels et l'utilisation des gestionnaires de mise en page

Par exemple, dans les JPanel où vous voulez deux lignes, donnez-lui un BoxLayout orienté le long de la BoxLayout.PAGE_AXIS, puis ajouter deux autres JPanels à ce BoxLayout utilisant , un top JPanel avec les boutons radio et le bas JPanel avec le JLabel et le JTextField (ou tout ce que vous voulez). Note latérale: ce serait un bon endroit pour utiliser un enum appelé TempScale qui avait trois valeurs: CELSIUS, FAHRENHEIT, KELVIN. Vous pourriez même donner à l'énumération les formules de conversion vers et depuis Kelvin.

Par exemple:

import java.awt.Component; 
import java.awt.event.*; 
import java.util.HashMap; 
import java.util.Map; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class TempConversion2 extends JPanel { 
    private ToFromPanel fromPanel = new ToFromPanel("From", true); 
    private ToFromPanel toPanel = new ToFromPanel("To", false); 
    private ButtonPanel buttonPanel = new ButtonPanel(fromPanel, toPanel); 

    public TempConversion2() { 
     setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); 
     add(fromPanel); 
     add(toPanel); 
     add(buttonPanel); 
    } 

    private static void createAndShowGui() { 
     TempConversion2 mainPanel = new TempConversion2(); 

     JFrame frame = new JFrame("Temp Convert"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

@SuppressWarnings("serial") 
class ButtonPanel extends JPanel { 

    public ButtonPanel(ToFromPanel fromPanel, ToFromPanel toPanel) { 
     add(new JButton(new ConvertAction("Convert", fromPanel, toPanel))); 
     add(new JButton(new ExitAction("Exit", KeyEvent.VK_X))); 
    } 

} 

@SuppressWarnings("serial") 
class ConvertAction extends AbstractAction { 
    private ToFromPanel fromPanel; 
    private ToFromPanel toPanel; 

    public ConvertAction(String name, ToFromPanel fromPanel, ToFromPanel toPanel) { 
     super(name); 
     int mnemonic = (int) name.charAt(0); 
     putValue(MNEMONIC_KEY, mnemonic); 
     this.fromPanel = fromPanel; 
     this.toPanel = toPanel; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     String text = fromPanel.getText(); 
     try { 
      double fromTemp = Double.parseDouble(text.trim()); 
      TempScale fromScale = fromPanel.getTempScalesPanel().getSelectedTempScale(); 
      double kelvinValue = fromScale.convertToKelvin(fromTemp); 

      TempScale toScale = toPanel.getTempScalesPanel().getSelectedTempScale(); 
      double toValue = toScale.convertFromKelvin(kelvinValue); 

      String toValueString = String.format("%.2f", toValue); 
      toPanel.setText(toValueString); 
     } catch (NumberFormatException e1) { 
      Component parentComponent = fromPanel; 
      String message = "Text must be a valid number: " + text; 
      String title = "Invalid Text Entered"; 
      int messageType = JOptionPane.ERROR_MESSAGE; 
      JOptionPane.showMessageDialog(parentComponent, message, title, messageType); 
      fromPanel.setText(""); 
     } 
    } 
} 

@SuppressWarnings("serial") 
class ExitAction extends AbstractAction { 
    public ExitAction(String name, int mnemonic) { 
     super(name); 
     putValue(MNEMONIC_KEY, mnemonic); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.exit(0); 
    } 
} 

@SuppressWarnings("serial") 
class ToFromPanel extends JPanel { 
    private String title; 
    private TempScalesPanel tempScalesPanel = new TempScalesPanel(); 
    private JTextField tempTextField = new JTextField(3); 

    public ToFromPanel(String title, boolean textFieldEnabled) { 
     this.title = title; 
     tempTextField.setFocusable(textFieldEnabled); 

     JPanel bottomPanel = new JPanel(); 
     bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.LINE_AXIS)); 
     bottomPanel.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); 
     bottomPanel.add(new JLabel("Temperature:")); 
     bottomPanel.add(Box.createHorizontalStrut(8)); 
     bottomPanel.add(tempTextField); 

     setBorder(BorderFactory.createTitledBorder(title)); 
     setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); 
     add(tempScalesPanel); 
     add(bottomPanel); 
    } 

    public String getTitle() { 
     return title; 
    } 

    public TempScalesPanel getTempScalesPanel() { 
     return tempScalesPanel; 
    } 

    public String getText() { 
     return tempTextField.getText(); 
    } 

    public void setText(String text) { 
     tempTextField.setText(text); 
    } 
} 

@SuppressWarnings("serial") 
class TempScalesPanel extends JPanel { 
    private ButtonGroup buttonGroup = new ButtonGroup(); 
    private Map<ButtonModel, TempScale> buttonTempMap = new HashMap<>(); 

    public TempScalesPanel() { 
     for (TempScale tempScale : TempScale.values()) { 
      JRadioButton radioButton = new JRadioButton(tempScale.getName()); 
      add(radioButton); 
      buttonGroup.add(radioButton); 
      buttonTempMap.put(radioButton.getModel(), tempScale); 
      // set first button as selected by default 
      if (buttonGroup.getSelection() == null) { 
       buttonGroup.setSelected(radioButton.getModel(), true); 
      } 
     } 
    } 

    public TempScale getSelectedTempScale() { 
     ButtonModel model = buttonGroup.getSelection(); 
     return buttonTempMap.get(model); 
    } 
} 

C'est le ENUM que je parlais. Notez que si vous modifiez l'énumération et que vous ajoutez par exemple un autre élément d'échelle de température, le programme l'inclura automatiquement dans l'interface graphique et dans les calculs. Dieu que j'aime Java et OOP.

public enum TempScale { 
    CELSIUS("Celsius", 1.0, -273.15), 
    FAHRENHEIT("Fahrenheit", 5.0/9.0, -459.67), 
    KELVIN("Kelvin", 1.0, 0.0); 

    private TempScale(String name, double ratioToKelvin, double absZero) { 
     this.name = name; 
     this.ratioToKelvin = ratioToKelvin; 
     this.absZero = absZero; 
    } 

    private String name; 
    private double ratioToKelvin; 
    private double absZero; 

    public String getName() { 
     return name; 
    } 

    public double getRatioToKelvin() { 
     return ratioToKelvin; 
    } 

    public double getAbsZero() { 
     return absZero; 
    } 

    public double convertToKelvin(double value) { 
     return (value - absZero) * ratioToKelvin; 
    } 

    public double convertFromKelvin(double kelvinValue) { 
     return (kelvinValue/ratioToKelvin) + absZero; 
    } 

} 
+0

Donc, à partir de ce que je comprends, créer un JPanel pour le conteneur De puis avec les JPanels j'ai maintenant: pnlFromRadioButton créer un autre panneau pnlTextEnterTemperature qui sont les JPanels imbriqués? 'code' pnlFrom.add (pnlFromRadioButton); pnlFrom.add (pnlTextEnterTemperature); – Ojouk

+0

@Ojouk: votre conteneur est déjà un JPanel. Créez deux autres pour les JRadioButtons et un pour la combinaison JLabel/JTextField. Par exemple, voir le code ci-dessus, qui montre également l'utilisation d'une énumération dans la création des JPanels et dans l'exécution des calculs. –

2

Toujours envisager de publier un MCVE. Par exemple, vous mise en page peut être simplifié et démontré avec:

import java.awt.BorderLayout; 
import java.awt.Label; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class TemperatureConversion extends JFrame{ 

    JPanel pnlFromRadioButton, pnlToRadioButton, pnlFromTemp, pnlButton; 

    // constructor 
    public TemperatureConversion(){ 

     pnlFromRadioButton = new JPanel(); 
     pnlFromRadioButton.add(new Label("From Panel")); 

     pnlToRadioButton = new JPanel(); 
     pnlToRadioButton.add(new Label("To Panel")); 

     pnlButton = new JPanel(); 
     pnlButton.add(new Label("Buttons Panel")); 

     // add panels to the frame 
     add(pnlFromRadioButton, BorderLayout.NORTH); 
     add(pnlToRadioButton, BorderLayout.CENTER); 
     add(pnlButton, BorderLayout.SOUTH); 

     setVisible(true); 
     setSize(400, 300); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public static void main(String[] args) { 
     new TemperatureConversion(); 
    } 
} 

Supposons que vous voulez un « Entrez la température: [] » étiquette à afficher dans une autre « ligne » sous à partir des boutons, votre constructeur va changer à:

public TemperatureConversion(){ 

     //set a layout manger. You could use grid layout 
     //GridLayout gridLayout = new GridLayout(4, 1); 
     //Or BoxLayout 
     BoxLayout boxLayout = new BoxLayout(getContentPane(), BoxLayout.Y_AXIS); // top to bottom 
     setLayout(boxLayout); 
     pnlFromRadioButton = new JPanel(); 
     pnlFromRadioButton.add(new Label("From Panel")); 

     //create a panel to hold the desired label 
     pnlFromTemp = new JPanel(); 
     pnlFromTemp.add(new JLabel("Enter Temperature: [ ]"));//add label 

     pnlToRadioButton = new JPanel(); 
     pnlToRadioButton.add(new Label("To Panel")); 

     pnlButton = new JPanel(); 
     pnlButton.add(new Label("Buttons Panel")); 

     // add panels to the frame 
     //the panel will show in the order added 
     add(pnlFromRadioButton); 
     add(pnlFromTemp); 
     add(pnlToRadioButton); 
     add(pnlButton); 

     setVisible(true); 
     setSize(400, 300); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
0

Désolé, je suis nouveau sur les forums et je ne connais pas l'étiquette d'affichage pour les codes @ c0der. Mais utiliser GridLayout a résolu mon problème et je veux vous montrer ce que j'ai fait, c'est un gros gâchis mais c'est ici. Voici mon code bizarre mais je ne sais pas comment le réduire davantage. Voici comment il est supposé regarder comme je le voulais et parce que maintenant je comprends ce que vous entendez par « Nest plus JPanels et utilisez les gestionnaires de mise en page » @Hovercraft complète des Anguilles: my temperature program

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 
import java.awt.*; 

public class TemperatureConversion extends JFrame { 

    // component 
    JTextField txtFromTemp, txtToTemp; 
    JLabel lblFromTemp, lblToTemp, lblToTempbox; 
    JRadioButton radFromCelsius, radFromFahrenheit, radFromKelvin; 
    JRadioButton radToCelsius, radToFahrenheit, radToKelvin; 
    JPanel pnlFromRadioButton, pnlToRadioButton, pnlFrom, pnlTo, pnlButton; 
    JPanel pnlEnterTemp, pnlComparableTemp; 
    ButtonGroup bgFrom, bgTo; 
    JButton btnConvert, btnExit; 

    // constructor 
    public TemperatureConversion() { 
    super("Temperature"); 

    // assign objects 
    radFromCelsius = new JRadioButton("Celsius", true); 
    radFromFahrenheit = new JRadioButton("Fahrenheit"); 
    radFromKelvin = new JRadioButton("Kelvin"); 
    lblFromTemp = new JLabel("Enter Temperature: "); 
    pnlFrom = new JPanel(); 
    btnConvert = new JButton("Convert"); 
    btnExit = new JButton("Exit"); 
    pnlButton = new JPanel(); 
    txtFromTemp = new JTextField(3); 
    lblToTemp = new JLabel("Comparable Temperature: "); 
    txtToTemp = new JTextField(3); 
    pnlTo = new JPanel(); 
    pnlEnterTemp = new JPanel(); 
    pnlComparableTemp = new JPanel(); 
    pnlFromRadioButton = new JPanel(); 
    pnlToRadioButton = new JPanel(); 

    // register the button to a listener 
    btnExit.addActionListener(new MyButtonListener()); 
    btnConvert.addActionListener(new MyButtonListener()); 

    // make the multiple choice exclusive but not a container 
    bgFrom = new ButtonGroup(); 
    bgFrom.add(radFromCelsius); 
    bgFrom.add(radFromFahrenheit); 
    bgFrom.add(radFromKelvin); 

    // radio buttons 
    radToCelsius = new JRadioButton("Celsius"); 
    radToFahrenheit = new JRadioButton("Fahrenheit", true); 
    radToKelvin = new JRadioButton("Kelvin"); 

    // make the multiple choice exclusive 
    bgTo = new ButtonGroup(); 
    bgTo.add(radToCelsius); 
    bgTo.add(radToFahrenheit); 
    bgTo.add(radToKelvin); 

    pnlFrom.setLayout(new GridLayout(2, 1)); 
    pnlFrom.add(pnlFromRadioButton); 
    pnlFrom.add(pnlEnterTemp); 

    pnlTo.setLayout(new GridLayout(2, 1)); 
    pnlTo.add(pnlToRadioButton); 
    pnlTo.add(pnlComparableTemp); 


    // decorate the panel 
    pnlFrom.setBorder(BorderFactory.createTitledBorder("From")); 
    pnlTo.setBorder(BorderFactory.createTitledBorder("To")); 

    // add radiobutton to panel 
    pnlFromRadioButton.add(radFromCelsius); 
    pnlFromRadioButton.add(radFromFahrenheit); 
    pnlFromRadioButton.add(radFromKelvin); 
    pnlToRadioButton.add(radToCelsius); 
    pnlToRadioButton.add(radToFahrenheit); 
    pnlToRadioButton.add(radToKelvin); 

    // add button to panel 
    pnlButton.add(btnConvert); 
    pnlButton.add(btnExit); 

    // add label and txt field to panel 
    pnlEnterTemp.add(lblFromTemp); 
    pnlEnterTemp.add(txtFromTemp); 
    pnlComparableTemp.add(lblToTemp); 
    txtToTemp.setEditable(false); 
    pnlComparableTemp.add(txtToTemp); 

    // add panels to the frame 
    add(pnlFrom, BorderLayout.NORTH); 
    add(pnlTo, BorderLayout.CENTER); 
    add(pnlButton, BorderLayout.SOUTH); 

    setVisible(true); 
    setSize(400, 300); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    pack(); 
    } 


    // private inner class to handle button event 
    private class MyButtonListener implements ActionListener { 
    // must override actionPerformed method 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == btnConvert) { 
     if (radFromCelsius.isSelected() && radToFahrenheit.isSelected()) { 
      int strInput = Integer.parseInt(txtFromTemp.getText()); 
      int celsius = strInput * 9/5 + 32; 
      txtToTemp.setText(Integer.toString(celsius)); 
     } else if (radFromCelsius.isSelected() && radToCelsius.isSelected() || 
      radFromFahrenheit.isSelected() && radToFahrenheit.isSelected() || 
      radFromKelvin.isSelected() && radToKelvin.isSelected()) { 
     txtToTemp.setText(txtFromTemp.getText()); 
     } else if (radToCelsius.isSelected() && radFromFahrenheit.isSelected()) { 
      int strInput = Integer.parseInt(txtFromTemp.getText()); 
      int fahrenheit = (strInput - 32) * 5/9; 
      txtToTemp.setText(Integer.toString(fahrenheit)); 
     } else if (radFromKelvin.isSelected() && radToCelsius.isSelected()) { 
      double strInput = Integer.parseInt(txtFromTemp.getText()); 
      double celsius = strInput - 273.15; 
      txtToTemp.setText(Double.toString(celsius)); 
     } else if (radFromKelvin.isSelected() && radToFahrenheit.isSelected()) { 
      double strInput = Integer.parseInt(txtFromTemp.getText()); 
      double fahrenheit = strInput - 459.67; 
      txtToTemp.setText(Double.toString(fahrenheit)); 
     } else if (radFromCelsius.isSelected() && radToKelvin.isSelected()) { 
      double strInput = Integer.parseInt(txtFromTemp.getText()); 
      double celsius = strInput + 273.15; 
      txtToTemp.setText(Double.toString(celsius)); 
     } else if (radFromFahrenheit.isSelected() && radToKelvin.isSelected()) { 
      double strInput = Integer.parseInt(txtFromTemp.getText()); 
      double fahrenheit = strInput + 255.37; 
      txtToTemp.setText(Double.toString(fahrenheit)); 
     } 
     } else if (e.getSource() == btnExit) { 
     System.exit(0); 
     } 
    } 
    } 

    public static void main(String[] args) { 
    new TemperatureConversion(); 
    } 
} 

Par ailleurs @Hovercraft pleine Des anguilles, votre solution est beaucoup plus efficace et avancée que mon niveau de pensée. Je suis novice à la programmation en général alors portez-moi sur mon code désordonné et l'organisation lol. J'ai à peine trempé mes pieds dans OOP. J'ai une idée de la façon dont vous avez utilisé enum pour TempScale et je vous remercie pour votre suggestion. Je les garderai dans mes notes comme références.