是否有一种简单的方法可以锁定Java Swing中GridLayout组件的宽高比?或者应该在包含该布局的JPanel上完成?
我试图在java中使用GRIDBAG布局实现此布局
public static void addComponentsToPane(Container pane) {
if (RIGHT_TO_LEFT) {
pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
}
JLabel label1,label2,label3,result,title;
JButton calculate_btn;
JTextField side1,side2,side3;
pane.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
if (shouldFill) {
//natural height, maximum width
c.fill = GridBagConstraints.HORIZONTAL;
}
title = new JLabel("Area of Triangle");
if (shouldWeightX) {
c.weightx = 0.5;
}
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 2;
c.gridy = -1;
pane.add(title, c);
label1 = new JLabel("Side 1: ");
if (shouldWeightX) {
c.weightx = 0.5;
}
c.fill = GridBagConstraints.HORIZONTAL;
c.ipady = 20;
c.gridx …Run Code Online (Sandbox Code Playgroud) 我正在尝试为JAVA中的银行应用程序制作GUI.如果我在eclipse中使用WindowBuilder,那么使用我的框架的绝对布局很容易创建任何东西,但问题是我调整框架的大小.这就是为什么我选择使用gridBagLayout,我可以使用weightx/y来让我的工作更轻松.我有点忘了如何正确使用这个布局,所以我第一次尝试在gridBagLayout主面板中添加JPanel时遇到困难.
这是我想要实现的(绝对布局):

这就是我所拥有的(在gridBagLayout中制作):

如果有人可以在我第一次添加flowLayout面板时指出我需要更改/添加的内容,我将不胜感激.基本上是第一个细胞的白色空间 - 我想摆脱它并控制它!
这是一些代码:
setBackground(new Color(255, 255, 255));
GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.columnWidths = new int[]{0, 0};
gridBagLayout.rowHeights = new int[]{0, 0};
gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE};
gridBagLayout.rowWeights = new double[]{1.0, Double.MIN_VALUE};
setLayout(gridBagLayout);
JPanel panel = new JPanel();
FlowLayout flowLayout = (FlowLayout) panel.getLayout();
flowLayout.setVgap(15);
flowLayout.setHgap(15);
flowLayout.setAlignment(FlowLayout.LEFT);
panel.setBackground(new Color(51, 102, 204));
GridBagConstraints gbc_panel = new GridBagConstraints();
gbc_panel.anchor = GridBagConstraints.NORTH;
gbc_panel.fill = GridBagConstraints.HORIZONTAL;
gbc_panel.gridx = 0;
gbc_panel.gridy = 0;
add(panel, gbc_panel);
JLabel label = new JLabel("European Bank");
label.setForeground(Color.WHITE); …Run Code Online (Sandbox Code Playgroud) 我正在为学校的项目制作GUI.我正在使用GridBagLayout.
我希望有一个标签指示输入(文件类型@ x = 0,y = 0),然后是另一个标签(实际文件名一旦选择@ x = 1, y = 0),然后是文件选择器的浏览按钮(@ x = 2, y = 0) .标签at (1,0)最初是空白的,但是当标签不包含文本时,我希望文本占据的区域占用一些空间.我还希望标签at (0,0)和按钮之间的空间(2,0)保持不变.
为了实现这一点,我试图将标签放在面板上,然后使用布局.但是我无法缝合以达到预期的效果.有人可以提供一些建议吗?GridBagLayout的下三行将以完全相同的方式布局.
这是GUI的屏幕截图的链接.

calibrationFileSelectionValueLabel = new JLabel("",Label.LEFT);
calibrationFileSelectionValueLabel.setName("calibrationFileSelection");
calibrationFileSelectionValueLabel.setMinimumSize(new Dimension(100,0));
calibrationFileSelectionValuePanel = new JPanel();
calibrationFileSelectionValuePanel.setBorder(BorderFactory.createEtchedBorder());
calibrationFileSelectionValuePanel.add(calibrationFileSelectionValueLabel);
c.gridx = 0;
c.gridy = 0;
c.fill = GridBagConstraints.NONE;
filesPanel.add(calibrationFileLabel,c);
c.gridy = 1;
filesPanel.add(frequencyFileLabel,c);
c.gridy = 2;
filesPanel.add(sampleFileLabel,c);
c.gridy = 3;
filesPanel.add(outputFileLabel,c);
c.gridx = 1;
c.gridy = 0;
c.fill = GridBagConstraints.BOTH;
// filesPanel.add(calibrationFileSelection,c);
filesPanel.add(calibrationFileSelectionValuePanel,c);
c.gridy = 1; …Run Code Online (Sandbox Code Playgroud) 我做了一个简单的操作GridBagLayout,在单元格(0,0),(1,0)和(0,1)中添加了按钮.
JPanel panelMain = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
panelMain.add(new JButton("0,0"),c);
c.gridx = 1;
c.gridy = 0;
panelMain.add(new JButton("1,0"),c);
c.gridx = 0;
c.gridy = 1;
panelMain.add(new JButton("0,1"),c);
Run Code Online (Sandbox Code Playgroud)
我很高兴看到由此产生的UI:

我想JButton在一个未连接到现有单元格的单元格中添加一个.我希望它被一个空的空间分开.当我尝试这个时,新的东西JButton被压在其他的旁边.这是补充:
JPanel panelMain = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
panelMain.add(new JButton("0,0"),c);
c.gridx = 1;
c.gridy = 0;
panelMain.add(new JButton("1,0"),c);
c.gridx = 0;
c.gridy = 1;
panelMain.add(new JButton("0,1"),c);
c.gridx …Run Code Online (Sandbox Code Playgroud) 在我的GUI应用程序中,我有几个JPanel,它们在我的程序运行期间的各个点被实例化,并且某些操作将导致其中一个显示在滚动窗格中:
mViewport.setViewportView(currentPanel);
Run Code Online (Sandbox Code Playgroud)
问题是,我的面板是使用Grid Bag Layouts完成的,其行为是将其自身置于其内部的JScrollPane中.这使得GUI看起来很奇怪.
有人知道强制网格包布局面板左上角对齐的方法吗?
谢谢!
编辑
请注意,我在这里询问整个面板在其滚动窗格内的对齐情况,而不是面板内的组件.

我正在使用GridBagLayout创建一个看起来像图片中的StatusBar.我有4个区域,所以我在第一个区域有一个按钮,然后在第二个区域有信息消息,然后我又想要两个(我还有第五个用于制作角落).
按钮区域非常适合,因为内容始终是具有相同宽度的按钮.与角落区域相同.信息区域必须获得所有可用空间.第3和第4个区域必须具有固定值,与屏幕大小无关.
我怎样才能做到这一点?
我目前的代码是:
public MyStatusBar() {
setLayout(new GridBagLayout());
setPreferredSize(new Dimension(getWidth(), 23));
GridBagConstraints c = new GridBagConstraints();
botonDispositivo = new JButton("");
this.setText(0, "Disconnected");
URL imageUrl = getClass().getResource("resources/22x22/dispositivo01.png");
this.setButtonImg(imageUrl);
this.setButtonEnabled(false);
c.gridx = 0;
c.gridy = 0;
c.fill = GridBagConstraints.BOTH;
c.anchor = GridBagConstraints.WEST;
c.gridwidth = 1;
c.gridheight = 1;
this.add(botonDispositivo, c);
c.insets= new Insets(0,10,0,0);
c.gridx ++;
c.gridy = 0;
c.weightx = 0.7;
c.fill = GridBagConstraints.HORIZONTAL;
msgLabel = new JLabel("");
msgLabel.setPreferredSize(new Dimension(500, msgLabel.getHeight()));
this.add(msgLabel, c);
this.setText(1, "Waiting for potentiostat conection");
c.gridx ++;
c.gridy …Run Code Online (Sandbox Code Playgroud) 我使用GridBagLayout和GridBagConstraints设计了一个GUI.它包含可变数量的行,每行包含一些可能的列布局.为了测试代码,我构建了具有不同颜色的面板GUI,用于说明每行和每列中所有单元格的位置和大小调整行为.这个测试GUI工作正常,但现在我需要自动化它的构造.具体来说,我需要将行作为三种不同类型之一.如果您运行下面的代码并查看生成的GUI,您可以看到row1是一种类型,行2,6和7是另一种类型,而行3,4和5是第三种类型.我需要将这三种类型的行中的每一行封装在自己的类中.更重要的是,我需要我的代码能够创建第三种类型的可变数量的行(在示例中由行3,4和5说明).(这是用于数据分析软件.面板将加载数据视图和工具来操纵数据视图.)
当我尝试将行封装到自己的类中时,GUI看起来应该看起来不应该看起来.下面的测试代码以它应该看起来的方式生成GUI布局.任何人都可以告诉我如何更改此代码,以便它具有上面第一段中描述的功能?
您可以将我的测试代码粘贴到您的IDE中,以使其立即运行.测试代码分为两个单独的文件,如下所示:
GridBagLayoutDemo.java的代码是:
import java.awt.*;
import javax.swing.JFrame;
public class GridBagLayoutDemo {
final static boolean RIGHT_TO_LEFT = false;
public static void addComponentsToPane(Container pane) {
if (RIGHT_TO_LEFT) {pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);}
pane.setLayout(new GridBagLayout());
// top row (fill, gridx, gridy, gridwidth 1, weightx 0, weighty 0, ipady 0)
TestPanel panelr1c1 = new TestPanel(Color.black);
GridBagConstraints constraint_r1c1 = getGridBagConstraints(GridBagConstraints.NONE,0,0,1,0,0,0);
pane.add(panelr1c1,constraint_r1c1);
TestPanel panelr1c2 = new TestPanel(Color.blue);
GridBagConstraints constraint_r1c2 = getGridBagConstraints(GridBagConstraints.HORIZONTAL,1,0,1,0.8,0,0);
pane.add(panelr1c2,constraint_r1c2);
TestPanel panelr1c2a = new TestPanel(Color.green);
GridBagConstraints constraint_r1c2a = getGridBagConstraints(GridBagConstraints.HORIZONTAL,2,0,1,0.8,0,0);
pane.add(panelr1c2a,constraint_r1c2a);
TestPanel panelr1c3 = new TestPanel(Color.red);
GridBagConstraints constraint_r1c3 …Run Code Online (Sandbox Code Playgroud) 当我将JComboBox放入带有GridBagLayout的JPanel时,我发现最长的JComboBox项目不会完全显示,而是显示部分带有'...'
例如,它显示'医疗成分'的'医疗保健成分'.
请看这里的截图:

代码是这样的:
JPanel infoPanel = JPanel(new GridBagLayout());
dataTypeCB = new JComboBox(dataTypeList.toArray());
infoPanel.add(dataTypeCB, new GridBagConstraints(1, 1, 1, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5,5,5,5), 0, 0));
Run Code Online (Sandbox Code Playgroud)
我已经找到了两个解决方案:
第二个解决方案代码:
dataTypeCB = new JComboBox(dataTypeList.toArray());
JPanel dataTypeCBPanel = new JPanel();//make item can be fully show up.
dataTypeCBPanel.add(dataTypeCB, BorderLayout.CENTER);
infoPanel.add(dataTypeCBPanel, new GridBagConstraints(1, 1, 1, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5,5,5,5), 0, 0));
Run Code Online (Sandbox Code Playgroud)
我的问题是:还有其他简单方法可以解决这个问题吗?
环境:Windows 7与JDK 1.6_25(64位版本)
非常感谢
我希望能够有三个JPanels p1 p2和p3,并让它们像这样布局:

我一直在玩FlowLayout,BoxLayout等,但我不确定我是否朝着正确的方向前进.我是Java的新手,所以如果我很诚实,我不知道该怎么办.
我喜欢BoxLayout如何工作,调整面板的大小,但我希望能够给它一些宽度属性.
我没有使用视觉设计师,这是我目前的窗口代码:
private void initialize() {
Dimension dimensions = Toolkit.getDefaultToolkit().getScreenSize();
frame = new JFrame();
frame.setLayout(new GridLayout(1, 3));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(dimensions.width / 2 - WINDOW_WIDTH / 2,
dimensions.height / 2 - WINDOW_HEIGHT / 2,
WINDOW_WIDTH, WINDOW_HEIGHT);
JPanel p1 = new JPanel(new BorderLayout());
p1.setBackground(Color.red);
JPanel p2 = new JPanel(new BorderLayout());
p2.setBackground(Color.black);
JPanel p3 = new JPanel(new BorderLayout());
p3.setBackground(Color.blue);
frame.add(p2);
frame.add(p1);
frame.add(p3);
}
Run Code Online (Sandbox Code Playgroud)
任何指针赞赏!
编辑:感谢mKorbel,我已经设法让它按照我想要的方式工作.正确的列没有完全像我要做的那样布局,但实际上我改变了主意并决定保留其他布局.

代码:
import java.awt.*;
import javax.swing.*;
public class PanelWindow extends JFrame {
private static final long …Run Code Online (Sandbox Code Playgroud) gridbaglayout ×10
java ×10
swing ×9
layout ×2
alignment ×1
boxlayout ×1
jcombobox ×1
jpanel ×1
jscrollpane ×1