Java JButton不会出现在GUI上
当我编译并运行我的代码时,除了JButton没有出现外,其他一切似乎都正常工作。我将它添加到框架上的JPanel中。我是新来的,所以我可能不知道在这里该注意什么。谢谢Java JButton不会出现在GUI上,java,swing,layout,jbutton,layout-manager,Java,Swing,Layout,Jbutton,Layout Manager,当我编译并运行我的代码时,除了JButton没有出现外,其他一切似乎都正常工作。我将它添加到框架上的JPanel中。我是新来的,所以我可能不知道在这里该注意什么。谢谢 import java.awt.*; import java.awt.event.*; import java.text.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.border.*; public class Temperat
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();
}
}
我会按照评论中的建议,使用 实际故障是关闭按钮在底部面板内的位置
closeButton.setBounds(140, 250, 75, 20);
这可能是输入错误或对坐标系的误解,每个新面板都有自己的专用系统,其中(0,0)是at组件的左上角。按钮位于(140250),但底部面板仅为360 x 50,因此位于可见边界之外
试着换成
closeButton.setBounds(0, 0, 75, 20);
我会按照评论中的建议,使用 实际故障是关闭按钮在底部面板内的位置
closeButton.setBounds(140, 250, 75, 20);
这可能是输入错误或对坐标系的误解,每个新面板都有自己的专用系统,其中(0,0)是at组件的左上角。按钮位于(140250),但底部面板仅为360 x 50,因此位于可见边界之外
试着换成
closeButton.setBounds(0, 0, 75, 20);
您的第一个也是主要的错误是:
topPanel.setLayout(null)代码>。虽然空布局和setBounds()
可能会像创建复杂GUI的最简单和最好的方式一样吸引新手,但您创建的GUI越多,在使用它们时遇到的困难就越严重。当GUI调整大小时,它们不会调整您的组件的大小,它们是一个需要增强或维护的皇家女巫,当它们放置在滚动窗格中时会完全失败,当在所有平台或屏幕分辨率与原始分辨率不同的情况下查看时,它们看起来非常糟糕
解决方案很简单:了解和如何使用布局管理器,然后使用它们。您可以在此处找到指向Swing教程的链接,包括布局管理器和其他Swing资源的链接:
e、 g
现在,您可能会说这看起来更复杂,也许是这样,但是当您想添加另一个JTextField和JLabel来表示开尔文温度标度时会发生什么呢?对于GUI,您需要调整GUI的大小,并重新计算添加新组件可能影响的任何组件的位置。对于我的GUI,您只需要添加几行新代码,而这些更改导致代码中出现错误的可能性比您的更改要小得多。e、 g.请注意,下面的更改只需要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));
您的第一个也是主要的错误是:topPanel.setLayout(null)代码>。虽然空布局和setBounds()
可能会像创建复杂GUI的最简单和最好的方式一样吸引新手,但您创建的GUI越多,在使用它们时遇到的困难就越严重。当GUI调整大小时,它们不会调整您的组件的大小,它们是一个需要增强或维护的皇家女巫,当它们放置在滚动窗格中时会完全失败,当在所有平台或屏幕分辨率与原始分辨率不同的情况下查看时,它们看起来非常糟糕
解决方案很简单:了解和如何使用布局管理器,然后使用它们。您可以在此处找到指向Swing教程的链接,包括布局管理器和其他Swing资源的链接:
e、 g
现在,您可能会说这看起来更复杂,也许是这样,但是当您想添加另一个JTextField和JLabel来表示开尔文温度标度时会发生什么呢?对于GUI,您需要调整GUI的大小,并重新计算添加新组件可能影响的任何组件的位置。对于我的GUI,您只需要添加几行新代码,而这些更改导致代码中出现错误的可能性比您的更改要小得多。e、 g.请注意,下面的更改只需要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));
您的第一个也是主要的错误是:topPanel.setLayout(null)代码>。虽然空布局和setBounds()
可能会像创建复杂GUI的最简单和最好的方式一样吸引新手,但您创建的GUI越多,在使用它们时遇到的困难就越严重。当GUI调整大小时,它们不会调整您的组件大小,它们是一个需要增强或维护的皇家女巫,它们在滚动窗格中完全失败,在所有平台或屏幕分辨率与原始分辨率不同的情况下查看时,它们看起来非常笨拙。解决方案很简单:了解和如何使用布局管理器,然后使用它们。您可以在此处找到指向Swing教程的链接,包括布局管理器和其他Swing资源的链接:请参见编辑以回答。您的第一个也是最主要的错误是:topPanel.setLayout(null)代码>。虽然空布局和setBounds()
可能会像创建复杂GUI的最简单和最好的方式一样吸引新手,但您创建的GUI越多,在使用它们时遇到的困难就越严重。当GUI调整大小时,它们不会调整您的组件大小,它们是一个需要增强或维护的皇家女巫,它们在滚动窗格中完全失败,在所有平台或屏幕分辨率与原始分辨率不同的情况下查看时,它们看起来非常笨拙。解决方案很简单:了解和如何使用布局管理器,然后使用它们。你可以在这里找到Swing教程的链接,包括布局管理器和其他Swing资源的链接:请参见编辑以回答。我不知道每个面板都有自己的坐标-我误解了,认为它都是基于框架的。谢谢你的帮助!我不知道每个面板都有自己的坐标-我误解了,以为它都是基于框架的。谢谢你的帮助!