我正在使用改进的过滤功能为自定义源服务器浏览器制作GUI。
这就是我so far。
然而,当我resize ...
时当我调整窗口大小时,我希望L4D2'过滤器面板'调整到当前最大容器宽度。我还希望能够在列中添加更多这些面板(例如框布局提供)。
Boxlayout得到的面板出现在一个列中,但它没有为它们的宽度做任何事情。 我想我可能需要覆盖过滤器面板首选大小方法,以便他们可以检索父容器的大小,但我不知道如何做到这一点。
我该如何解决这个问题?
编辑:这是一个描述问题的示例程序。
import javax.swing.*;
import java.awt.*;
public class guiExampleProblem {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final MyWindows wnd = new MyWindows("guiExampleProblem");
wnd.setVisible(true);
}
});
}
}
class MyWindows extends JFrame {
public MyWindows(String text) {
super(text);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
JPanel containerPanel1 = new JPanel();
JPanel containerPanel2 = new JPanel();
JPanel containerPanel3 = new JPanel();
containerPanel1.setBackground(Color.BLACK);
containerPanel2.setBackground(Color.RED);
containerPanel3.setBackground(Color.GREEN);
mainPanel.add(containerPanel1);
mainPanel.add(containerPanel2);
mainPanel.add(containerPanel3);
this.add(mainPanel);
pack();
}
}
调整窗口大小时,我希望面板仅沿x轴展开,并在y轴上保持恒定高度,但在示例中,面板在xy轴上展开。
答案 0 :(得分:0)
放置要在BorderLayout的CENTER中拉伸的面板(带有BoxLayout) - 将面板放在该BorderLayout的EAST的右侧。你没有详细说明你想要做什么,也没有任何代码,但这可能是你想要的。
-
在你的解决方案之后:在我看来,在这里使用FlowLayout令人困惑 - 它一个接一个地水平放置它的组件,你从容器的宽度获得首选大小的技巧使它表现不同。我也避免在我的应用程序中进入布局逻辑,所以我寻找另一种方法来做到这一点并提出:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
public class guiExampleProblem2
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
final MyWindows2 wnd = new MyWindows2("guiExampleProblem2");
wnd.setVisible(true);
}
});
}
}
class MyWindows2 extends JFrame
{
public MyWindows2(String text)
{
super(text);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));
JPanel containerPanel1 = addContainedPanel(Color.BLACK, 60, 60, mainPanel);
JPanel containerPanel2 = addContainedPanel(Color.RED, 60, 60, mainPanel);
JPanel containerPanel3 = addContainedPanel(Color.GREEN, 60, 60, mainPanel);
this.add(mainPanel, BorderLayout.NORTH);
pack();
}
JPanel addContainedPanel(Color color, int width, int height, JPanel container)
{
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(width, height));
panel.setBackground(color);
container.add(panel);
return panel;
}
}
这使用BorderLayout的NORTH部分(顺便说一下,这是JFrame的默认布局)来做你想要的主要事情 - 横向拉伸事物。带有页轴的BoxLayout旨在从上到下排列,所以我认为这对读者来说不那么容易混淆。无论如何,这是另一种方法,我认为使用组件 - 包括布局管理器 - 更像是他们的意图和记录。
答案 1 :(得分:0)
我设法通过覆盖'过滤器面板'的getPrefferedSize方法来获得所需的功能,以便它们检索父容器宽度并使用它。以下是示例形式的代码:
import javax.swing.*;
import java.awt.*;
public class guiExampleProblem {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final MyWindows wnd = new MyWindows("guiExampleProblem");
wnd.setVisible(true);
}
});
}
}
class MyWindows extends JFrame {
public MyWindows(String text) {
super(text);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new FlowLayout());
JPanel containerPanel1 = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(this.getParent().getWidth(),60);
}
};
JPanel containerPanel2 = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(this.getParent().getWidth(),60);
}
};
JPanel containerPanel3 = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(this.getParent().getWidth(),60);
}
};
containerPanel1.setBackground(Color.BLACK);
containerPanel2.setBackground(Color.RED);
containerPanel3.setBackground(Color.GREEN);
mainPanel.add(containerPanel1);
mainPanel.add(containerPanel2);
mainPanel.add(containerPanel3);
this.add(mainPanel);
pack();
}
}