Java 为什么我不能更改框架内面板的位置?
我正在尝试创建一个带有几个按钮和绘图区域的GUI。 除了绘图区域非常小且不在正确位置之外,它似乎正在工作。 这是我的密码:Java 为什么我不能更改框架内面板的位置?,java,user-interface,jframe,jpanel,Java,User Interface,Jframe,Jpanel,我正在尝试创建一个带有几个按钮和绘图区域的GUI。 除了绘图区域非常小且不在正确位置之外,它似乎正在工作。 这是我的密码: public class ssGUI extends JPanel implements ActionListener{ private static final long serialVersionUID = 1L; protected JButton b1, bConnect, bDisconnect, b2; protected JPanel canvas; pub
public class ssGUI extends JPanel implements ActionListener{
private static final long serialVersionUID = 1L;
protected JButton b1, bConnect, bDisconnect, b2;
protected JPanel canvas;
public ssGUI() {
// run button
b1 = new JButton("do something");
b1.setVerticalTextPosition(AbstractButton.CENTER);
b1.setHorizontalTextPosition(AbstractButton.LEADING);
b1.setMnemonic(KeyEvent.VK_D);
b1.addActionListener(this);
b1.setEnabled(false);
// connect button
bConnect = new JButton("Connect");
bConnect.setMnemonic(KeyEvent.VK_E);
bConnect.addActionListener(this);
bConnect.setEnabled(true);
// disconnect button
bDisconnect = new JButton("Disconnect");
bDisconnect.setMnemonic(KeyEvent.VK_E);
bDisconnect.addActionListener(this);
bDisconnect.setEnabled(false);
// clean nmea data button
b2 = new JButton("do something else");
b2.setMnemonic(KeyEvent.VK_E);
b2.addActionListener(this);
b2.setEnabled(false);
// drawing panel
canvas = new JPanel();
canvas.setBackground(Color.white);
add(b1); add(bConnect); add(bDisconnect); add(b2); add(canvas, BorderLayout.CENTER);
}
public static void createAndShowGUI() {
JFrame frame = new JFrame("Range Adjustment GUI");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ssGUI newContentPane = new ssGUI();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
frame.setLocation(500, 500);
frame.setSize(500, 500);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}}
这就是我的GUI的外观:
如您所见,“画布”非常小,位于按钮的侧面。
我需要它放在他们下面,并填补框架面积。
有人能帮我解决那个问题吗?
谢谢您的帮助。这是布局的另一个问题 JPanel有一个默认布局,我看不到您为
ssGUI
类设置布局。因此将使用默认布局(FlowLayout)
添加到ssGUI
的所有组件将以线性方式排成一行,尽可能多地容纳。当组件超过宽度时,它将被放置到下一行
可以考虑使用主面板的布局<代码> SSGUI < /代码>。A可能会给你想要的
BorderLayout
NORTH
位置import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ssGUI extends JPanel implements ActionListener {
private static final long serialVersionUID = 1L;
protected JButton b1, bConnect, bDisconnect, b2;
protected JPanel canvas;
public ssGUI() {
setLayout(new BorderLayout());
// run button
b1 = new JButton("do something");
b1.setVerticalTextPosition(AbstractButton.CENTER);
b1.setHorizontalTextPosition(AbstractButton.LEADING);
b1.setMnemonic(KeyEvent.VK_D);
b1.addActionListener(this);
b1.setEnabled(false);
// connect button
bConnect = new JButton("Connect");
bConnect.setMnemonic(KeyEvent.VK_E);
bConnect.addActionListener(this);
bConnect.setEnabled(true);
// disconnect button
bDisconnect = new JButton("Disconnect");
bDisconnect.setMnemonic(KeyEvent.VK_E);
bDisconnect.addActionListener(this);
bDisconnect.setEnabled(false);
// clean nmea data button
b2 = new JButton("do something else");
b2.setMnemonic(KeyEvent.VK_E);
b2.addActionListener(this);
b2.setEnabled(false);
// drawing panel
canvas = new JPanel();
canvas.setBackground(Color.white);
JPanel topPanel = new JPanel();
topPanel.add(b1);
topPanel.add(bConnect);
topPanel.add(bDisconnect);
topPanel.add(b2);
add(topPanel, BorderLayout.NORTH);
add(canvas, BorderLayout.CENTER);
}
public static void createAndShowGUI() {
JFrame frame = new JFrame("Range Adjustment GUI");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ssGUI newContentPane = new ssGUI();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
frame.setLocation(500, 500);
frame.setSize(500, 500);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
}
add(画布,BorderLayout.CENTER)代码>是正确的,但是其他组件呢?您没有指定它们的位置吗?一个简单的解决方案是将另一个面板添加到borderlayout.north并添加按钮。我将添加部分更改为:add(b1,borderlayout.LINE_START);添加(b连接,边框布局。页面\开始);添加(b断开连接,BorderLayout.CENTER);添加(b2,边界布局。线_结束);添加(canvas,BorderLayout.PAGE_END)
但它不做任何事情。GUI看起来仍然一样,我在哪里声明此布局?您可以在ssGUI
的构造函数中执行此操作,例如this.setLayout(new GridBagLayout())代码>现在我在说:无法添加到布局:约束必须是GridBagConstraint
时出错。我必须改变我的add()
方法吗?@DanyLavrov GridBagLayout是最灵活的布局之一,不幸的是,它也是更复杂的布局之一。您需要为其设置约束。请看一下我的解决方案中的链接。我已经读过了。对于每个组件,我都创建了以下内容:GridBagConstraints c=newgridbagconstraints();c.gridx=0;c、 gridy=0;添加(b1,c)当然,我已经为每一个更改了gridx和gridy。仍然得到相同的错误