我目前正在使用Java浏览器。我想在左上角有一个后退按钮,右边有一个带有URL的JTextfield。我希望按钮始终具有相同的大小,但文本字段要更改它的宽度以匹配JFrame的宽度。它不适用于BorderLayout,我试过这个:
SpringLayout sl = new SpringLayout();
setLayout(sl);
sl.putConstraint(SpringLayout.WEST, back, 5, SpringLayout.WEST, this);
sl.putConstraint(SpringLayout.NORTH, back, 5, SpringLayout.NORTH, this);
sl.putConstraint(SpringLayout.WEST, addressBar, 5, SpringLayout.EAST, back);
sl.putConstraint(SpringLayout.NORTH, addressBar, 5, SpringLayout.NORTH, this);
sl.putConstraint(SpringLayout.SOUTH, back, 25, SpringLayout.NORTH, this);
sl.putConstraint(SpringLayout.SOUTH, addressBar, 25, SpringLayout.NORTH, this);
sl.putConstraint(SpringLayout.EAST, addressBar, 5, SpringLayout.EAST, this);
add(back);
add(addressBar);
其中“back”是JButton,addressBar是JTextField。按钮似乎工作,但addressBar根本就没有绘制。
有什么建议吗?
答案 0 :(得分:2)
有很多方法可以解决这个问题,实际上有一种方法是通过嵌套JPanel来实现BorderLayout。将按钮放入BorderLayout的BorderLayout.WEST位置使用容器,但将JTextField BorderLayout.CENTER放在同一个容器中,然后将该容器放入主容器BorderLayout.CENTER。
GridBagLayout也可以解决这个问题,但同样,最好/最简单的解决方案通常会涉及嵌套 JPanels(对于你的容器),每个都有自己的布局管理器。
修改强>
例如:
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.*;
public class BrowserFoo {
private static void createAndShowGui() {
JPanel topPanel = new JPanel(new BorderLayout(2, 2));
topPanel.add(new JButton("Back"), BorderLayout.WEST);
topPanel.add(new JTextField(20), BorderLayout.CENTER);
JPanel mainPanel = new JPanel(new BorderLayout());
mainPanel.add(topPanel, BorderLayout.NORTH);
mainPanel.add(Box.createRigidArea(new Dimension(400, 400)));
JFrame frame = new JFrame("BrowserFoo");
frame.setDefaultCloseOperation(JFrame.EXIT_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();
}
});
}
}
请注意,如果您重新调整此GUI的大小,则textarea和按钮将保持在正确的位置。