Kry*_*tos 5 java user-interface swing jpanel gridbaglayout
我正在使用 GridBagLayout 创建一个名为“预设”的 JPanel,它在 JFrame 中被复制多次。每个预设都有多行(JPanels)。我的目标是只显示一行(第一行),但是当单击编辑按钮时,它们都会显示出来。现在,编辑按钮可以工作,但行之间有很大的空间。我希望当多余的线折叠时,每个预设将直接位于彼此上方(没有空格)。你可以在下图中看到我在说什么。
这是它的外观:

这就是我想要的样子:

我相当肯定我需要对 GridBag 做点什么,但我不知道是什么。我已经阅读了几个教程,并按照我认为应该的方式编写了它,但没有运气。
package SSCCE;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
public class UI extends JFrame{
private final static int HEIGHT = 600;
private final static int WIDTH = 730;
private JPanel pane; //Pane that stores accounts
private JScrollPane scroller;
private Preset[] branches;
public static void main(String[] args) {
JFrame frame = new UI();
}
public UI(){
//Make the UI close when the exit button is clicked
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Sets the size of the UI
this.setSize(WIDTH, HEIGHT);
//Set the layout and add components to it
this.setLayout(new BorderLayout());
//Reads in the settings and sets up the branches
populateBranches();
pane = new JPanel();
pane.setLayout(new GridLayout(branches.length,1));
for (int i = 0; i < branches.length; i++){
pane.add(branches[i]);
}
//Create the center pane of the BorderLayout
scroller = new JScrollPane(pane);
scroller.createVerticalScrollBar();
this.add(scroller,BorderLayout.CENTER);
//Makes the UI visible
this.setVisible(true);
}
private void populateBranches(){
//Populates the branches array based on what is read in, or not read in from the file
branches = new Preset[15];
for (int i = 0; i < branches.length; i++){
branches[i] = new Preset();
branches[i].setEnabled(false);
}
}
public class Preset extends JPanel{
private JTextField eName;
private JButton edit;
private JButton activate;
private JComboBox printer;
private JPanel line1;
private JPanel line2;
private String branchName;
private String ipAddress;
private boolean enableAll;
public Preset(){
eName = new JTextField(20);
edit = new JButton("Edit");
activate = new JButton("Activate");
JPanel nameContainer = new JPanel();
nameContainer.setLayout(new FlowLayout());
nameContainer.add(eName);
printer = new JComboBox();
//
line1 = new JPanel();
line1.setLayout(new FlowLayout());
line1.add(nameContainer);
line1.add(edit);
line1.add(activate);
//
line2 = new JPanel();
line2.setLayout(new BorderLayout());
line2.add(printer, BorderLayout.WEST);
GridBagLayout grid = new GridBagLayout();
GridBagConstraints cons = new GridBagConstraints();
cons.fill = GridBagConstraints.BOTH;
this.setLayout(grid);
cons.ipady = 100;
cons.ipadx = 100;
cons.weighty = 0D;
cons.gridx = 0;
cons.gridy = 0;
cons.gridwidth = 2;
cons.gridheight = 1;
grid.setConstraints(line1, cons);
this.add(line1);
cons.ipady = 100;
cons.ipadx = 100;
cons.weighty = 0D;
cons.gridx = 0;
cons.gridy = 1;
cons.gridwidth = 2;
cons.gridheight = 1;
grid.setConstraints(line2, cons);
this.add(line2);
//Enable all components
enableAll = true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
删除每个语句,在Y轴填充的受让人GridBagConstraints的Preset JPanel,即
cons.ipady = 100;
Run Code Online (Sandbox Code Playgroud)
我不认为这是对你的问题的“真正”答案,但你需要考虑的是:摆脱 gridbag。我在您想要的布局中没有看到任何需要它的内容。创建带有两个子面板的每个面板;第二个子面板包含您希望默认情况下不可见并稍后显示的内容,并使用 setVisible() 来执行此操作。
我从未对所有 GridBagConstraints 感到满意,它们似乎以我没有明确模型的方式交互。由于这个原因,我避免使用 GridBagLayout,所以我无法帮助使用 GridBagLayout 来做到这一点。但我不明白为什么不能使用更简单(且更简洁)的现有 Swing 容器和布局管理器来做到这一点。
| 归档时间: |
|
| 查看次数: |
3447 次 |
| 最近记录: |