2015-03-07 2 views
0

Когда я компилирую и запускаю свой код, все работает нормально, за исключением того, что JButton не появляется. Я добавляю его в JPanel, который находится в кадре. Я новичок, поэтому я не знаю, что искать здесь. Благодаря!JButton не отображается в GUI

import java.awt.*; 
import java.awt.event.*; 
import java.text.*; 

import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.border.*; 

public class TemperatureConverter extends JFrame{ 

    //declarations 
    private JLabel celJLabel, farJLabel; 

    private JTextField celJTextField, farJTextField; 

    private JSlider sliderJSlider; 

    private JButton closeButton; 

    private TitledBorder border; 

    private JPanel topPanel, bottomPanel; 

    double celsiusDegrees, farenheitDegrees, sliderValue; 

    DecimalFormat decimalFormat = new DecimalFormat("#.0"); 

    public TemperatureConverter() 
    { 
     createUserInterface(); 
    } 

    public void createUserInterface() 
    { 
     //create the JFrame 
     Container frame = getContentPane(); 
     frame.setBackground(Color.white); 
     frame.setLayout(null); 

     border = new TitledBorder("Convert between C & F"); 
     border.setTitleColor(Color.black); 
     border.setTitleFont(new Font("Default", Font.ITALIC, 12)); 
     border.setTitleJustification(TitledBorder.LEFT); 
     border.setTitlePosition(TitledBorder.TOP); 

     topPanel = new JPanel(); 
     topPanel.setBounds(20,10,360,300); 
     topPanel.setForeground(Color.black); 
     topPanel.setBackground(Color.white); 
     topPanel.setLayout(null); 
     topPanel.setBorder(border); 
     frame.add(topPanel); 

     bottomPanel = new JPanel(); 
     bottomPanel.setBounds(20,310,360,50); 
     bottomPanel.setForeground(Color.black); 
     bottomPanel.setBackground(Color.white); 
     bottomPanel.setLayout(null); 
     frame.add(bottomPanel); 

     celJLabel = new JLabel(); 
     celJLabel.setBounds(120, 200, 60, 20); 
     celJLabel.setBackground(Color.white); 
     celJLabel.setFont(new Font("Default", Font.PLAIN, 12)); 
     celJLabel.setText("Celcius"); 
     celJLabel.setHorizontalAlignment(JLabel.LEFT); 
     topPanel.add(celJLabel); 

     farJLabel = new JLabel(); 
     farJLabel.setBounds(120, 220, 60, 20); 
     farJLabel.setBackground(Color.white); 
     farJLabel.setFont(new Font("Default", Font.PLAIN, 12)); 
     farJLabel.setText("Faranheit"); 
     farJLabel.setHorizontalAlignment(JLabel.LEFT); 
     topPanel.add(farJLabel); 

     celJTextField = new JTextField(); 
     celJTextField.setBounds(195,200, 50, 15); 
     celJTextField.setFont(new Font("Default", Font.PLAIN, 12)); 
     celJTextField.setHorizontalAlignment(JTextField.CENTER); 
     celJTextField.setForeground(Color.black); 
     celJTextField.setBackground(Color.white); 
     topPanel.add(celJTextField); 

     farJTextField = new JTextField(); 
     farJTextField.setBounds(195,225, 50, 15); 
     farJTextField.setFont(new Font("Default", Font.PLAIN, 12)); 
     farJTextField.setHorizontalAlignment(JTextField.CENTER); 
     farJTextField.setForeground(Color.black); 
     farJTextField.setBackground(Color.white); 
     topPanel.add(farJTextField); 

     sliderJSlider = new JSlider(JSlider.HORIZONTAL, 0,100,0); 
     sliderJSlider.setBounds(20, 20, 310, 120); 
     sliderJSlider.setMajorTickSpacing(10); 
     sliderJSlider.setMinorTickSpacing(5); 
     sliderJSlider.setPaintTicks(true); 
     sliderJSlider.setPaintLabels(true); 
     sliderJSlider.setForeground(Color.black); 
     sliderJSlider.setBackground(Color.white); 
     topPanel.add(sliderJSlider); 
     sliderJSlider.addChangeListener( 
       new ChangeListener() 
       { 
        public void stateChanged(ChangeEvent event) 
        { 
         sliderStateChanged(event); 
        }  
       } 

       ); 

     closeButton = new JButton(); 
     closeButton.setBounds(140, 250, 75, 20); 
     closeButton.setFont(new Font("Default", Font.PLAIN,12)); 
     closeButton.setText("Close"); 
     closeButton.setForeground(Color.black); 
     closeButton.setBackground(Color.white); 
     bottomPanel.add(closeButton); 
     closeButton.addActionListener(

      new ActionListener() 
      { 
       public void actionPerformed(ActionEvent event) 
       { 
        closeActionPerformed(event); 
       } 
      } 
      ); 

     setTitle("Temperature Converter"); 
     setSize(400,400); 
     setVisible(true); 

    } 
    public static void main(String[] args) 
    { 
     TemperatureConverter application = new TemperatureConverter(); 
     application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void sliderStateChanged(ChangeEvent event) 
    { 
     farenheitDegrees = sliderJSlider.getValue(); 
     calculateCelsiusTemperature(); 

    } 
    public void calculateCelsiusTemperature() 
    { 
     celsiusDegrees = (farenheitDegrees - 32)*5.0/9.0; 
     outputTemps(); 
    } 
    public void outputTemps() 
    { 
     celJTextField.setText(decimalFormat.format(celsiusDegrees)); 
     farJTextField.setText(decimalFormat.format(farenheitDegrees)); 
    } 
    public void closeActionPerformed(ActionEvent event) 
    { 
     TemperatureConverter.this.dispose(); 
    } 

    } 
+5

Ваша первая и главная ошибка заключается в следующем: 'topPanel.setLayout (null);'. Хотя нулевые макеты и 'setBounds()' могут показаться Swing новичками, как самый простой и лучший способ создания сложных графических интерфейсов, чем больше Swing GUI вы создадите более серьезные трудности, с которыми вы столкнетесь при их использовании. Они не будут изменять размеры ваших компонентов при изменении размера графического интерфейса, они являются королевской ведьмой для улучшения или поддержки, они полностью не выполняются при размещении в scrollpanes, они выглядят ужасно ужасно при просмотре на всех платформах или разрешениях экрана, отличных от исходного , –

+2

Решение прост: узнайте и как использовать менеджеров макета, а затем используйте их. Вы можете найти ссылки на учебные руководства Swing, в том числе для менеджеров макетов и других ресурсов Swing: [Swing Info] (http://stackoverflow.com/questions/tagged/swing) –

+0

См. Править для ответа. –

ответ

2

Я бы воспользовался рекомендацией из комментариев, воспользуйтесь proper layout manager.

Фактическая неисправность - это размещение кнопки закрытия в нижней панели.

closeButton.setBounds(140, 250, 75, 20); 

Это может быть опечаткой или непонимание системы координат, каждая новая панель имеет свою собственную систему, где (0,0) является левой верхним углу на компоненте. Кнопка находится в (140, 250), однако bottomPanel составляет всего 360 х 50, так что за пределами видимых границ ..

Попытка изменения в

closeButton.setBounds(0, 0, 75, 20); 
+0

Я не знал, что у каждой панели есть свои собственные координаты - я неправильно понял и думал, что все это основано на кадре. Спасибо за помощь! – pcdr

2

Ваша первая и главная ошибка заключается в следующем: topPanel.setLayout(null); , Хотя нулевые макеты и setBounds() могут показаться новичкам Swing, как самый простой и лучший способ создания сложных графических интерфейсов, чем больше Swing GUI вы создадите более серьезные трудности, с которыми вы столкнетесь при их использовании. Они не будут изменять размеры ваших компонентов при изменении размера графического интерфейса, они являются королевской ведьмой для улучшения или поддержки, они полностью не выполняются при размещении в scrollpanes, они выглядят ужасно ужасно при просмотре на всех платформах или разрешениях экрана, отличных от исходного ,

Решение прост: узнайте о том, как использовать диспетчеры макетов, и затем используйте их. Вы можете найти ссылки на Swing, учебные пособия, включая те, для менеджеров компоновки и других Свинг ресурсов здесь: Swing Info


например,

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 

import javax.swing.*; 

public class TempConverter extends JPanel { 
    private static final int PREF_W = 400; 
    private static final int GAP = 5; 
    private JTextField celJTextField = new JTextField(10); 
    private JTextField farJTextField = new JTextField(10); 
    private JSlider sliderJSlider = new JSlider(0, 100, 0); 
    private JButton closeButton = new JButton("Close"); 

    public TempConverter() { 
     sliderJSlider.setMajorTickSpacing(10); 
     sliderJSlider.setMinorTickSpacing(5); 
     sliderJSlider.setPaintTicks(true); 
     sliderJSlider.setPaintLabels(true); 

     JPanel textFieldPanel = new JPanel(new GridBagLayout()); 
     textFieldPanel.add(new JLabel("Celcius:"), createGbc(0, 0)); 
     textFieldPanel.add(celJTextField, createGbc(1, 0)); 
     textFieldPanel.add(new JLabel("Faranheit:"), createGbc(0, 1)); 
     textFieldPanel.add(farJTextField, createGbc(1, 1)); 
     JPanel textFieldWrapperPanel = new JPanel(new GridBagLayout()); 
     textFieldWrapperPanel.add(textFieldPanel); 

     JPanel conversionPanel = new JPanel(new BorderLayout()); 
     conversionPanel.setBorder(BorderFactory.createTitledBorder("Foo")); 
     conversionPanel.setLayout(new BorderLayout()); 
     conversionPanel.add(sliderJSlider, BorderLayout.PAGE_START); 
     conversionPanel.add(textFieldWrapperPanel, BorderLayout.CENTER); 

     JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.LEADING)); 
     bottomPanel.add(closeButton); 

     setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP)); 
     setLayout(new BorderLayout()); 
     add(conversionPanel, BorderLayout.CENTER); 
     add(bottomPanel, BorderLayout.PAGE_END); 
    } 

    private GridBagConstraints createGbc(int x, int y) { 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridx = x; 
     gbc.gridy = y; 
     gbc.gridheight = 1; 
     gbc.gridwidth = 1; 
     gbc.weightx = 1.0; 
     gbc.weighty = 1.0; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.insets = new Insets(GAP, GAP, GAP, GAP); 

     return gbc; 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     Dimension superSize = super.getPreferredSize(); 
     ; 
     if (isPreferredSizeSet()) { 
     super.getPreferredSize(); 
     } 
     int prefW = Math.max(PREF_W, superSize.width); 
     return new Dimension(prefW, superSize.height); 
    } 

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

     JFrame frame = new JFrame("TempConverter"); 
     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(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

Теперь вы можете сказать, что это выглядит более сложным, и, возможно, это есть, но что происходит, когда вы хотите добавить еще один JTextField и JLabel для представления шкалы температуры Кельвина? Для вашего графического интерфейса вам необходимо изменить размер графического интерфейса пользователя и пересчитать позицию любого компонента, который может быть выполнен путем добавления новых компонентов. Для моего графического интерфейса вам просто нужно добавить несколько новых строк, и вероятность изменений, вызвавших ошибку в моем коде, равна , а меньше, чем у ваших изменений. например обратите внимание, что приведенные ниже изменения требуют всего 3 строки кода. Все остальное не изменилось:

public class TempConverter extends JPanel { 
    private static final int PREF_W = 400; 
    private static final int GAP = 5; 
    private JTextField celJTextField = new JTextField(10); 
    private JTextField farJTextField = new JTextField(10); 
    private JTextField KelvinJTextField = new JTextField(10); // !!! Added 
    private JSlider sliderJSlider = new JSlider(0, 100, 0); 
    private JButton closeButton = new JButton("Close"); 

    public TempConverter() { 
     sliderJSlider.setMajorTickSpacing(10); 
     sliderJSlider.setMinorTickSpacing(5); 
     sliderJSlider.setPaintTicks(true); 
     sliderJSlider.setPaintLabels(true); 

     JPanel textFieldPanel = new JPanel(new GridBagLayout()); 
     textFieldPanel.add(new JLabel("Celcius:"), createGbc(0, 0)); 
     textFieldPanel.add(celJTextField, createGbc(1, 0)); 
     textFieldPanel.add(new JLabel("Faranheit:"), createGbc(0, 1)); 
     textFieldPanel.add(farJTextField, createGbc(1, 1)); 

     // !!! added 
     textFieldPanel.add(new JLabel("Kelvin:"), createGbc(0, 2)); 
     textFieldPanel.add(KelvinJTextField, createGbc(1, 2)); 
Смежные вопросы