相关疑难解决方法(0)

我应该避免在Java Swing中使用set(Preferred | Maximum | Minimum)Size方法吗?

有几次我因为建议使用以下方法而受到批评:

  1. 有必要对setPreferredSize
  2. 了setMinimumSize
  3. setMaximumSize

Swing组件上.当我想在显示的组件之间定义比例时,我没有看到任何替代它们的用法.我被告知这个:

对于布局,答案总是相同的:使用合适的LayoutManager

我在网上搜索了一下,但我没有找到任何关于这个主题的综合分析.所以我有以下问题:

  1. 我应该完全避免使用这些方法吗?
  2. 已经定义了这些方法的原因.那我什么时候应该使用它们?在哪种情况下?出于什么目的?
  3. 使用这些方法的负面后果究竟是什么?(我只能考虑在具有不同屏幕分辨率的系统之间添加可移植性).
  4. 我认为任何LayoutManager都不能完全满足所有需要的布局需求.我是否真的需要为布局上的每个小变化实现一个新的LayoutManager?
  5. 如果4的答案是"是",那么这是否会导致LayoutManager类的扩散变得难以维护?
  6. 在我需要定义组件子级之间的比例的情况下(例如,child1应该使用10%的空间,child2 40%,child3 50%),是否可以在不实现自定义LayoutManager的情况下实现这一点?

java swing layout-manager

471
推荐指数
8
解决办法
5万
查看次数

Swing中的变量布局

当你不知道你将拥有多少组件以及它们有多大时,你会如何获得一个体面的gui?

例如,用户输入他们想要的文本字段数以及哪些文本字段在有边框的面板中分组,程序会生成此字段.

我一直在使用GridLayout,但问题是它使所有单元格具有相同的宽度和高度,这在所有组件具有相同大小时都很好,但是当我例如具有文本字段和带有多个的边框面板时字段,文本字段伸出或面板被挤压.

我希望所有组件都具有最小尺寸,但仍然可以使用.

现在的示例,使用GridLayout,所有字段都是正常的,单行JTextFields,其中标题为date的面板被完全挤压(它有三个字段),第一级字段是大的.任何人有任何指针?

java layout swing

11
推荐指数
1
解决办法
5463
查看次数

什么是最好的布局管理器?

在此输入图像描述

我想做一个看起来像上面的gui.现在我有一个面板,它将保存名称标签,名称文本字段,brith日期标签和生日文本字段.我的问题是什么是最好的布局管理器在面板上使用,以便"名称组件"行(标签+文本字段)和"出生日期组件"行(标签+文本字段),将垂直均匀地分布在小组.

我想过使用流布局,但这会导致两行组件之间没有间隙.我想过使用网格布局,但我不知道两行组件之间的间隙大小.

一个更复杂的方法......我考虑将名称标签和文本字段放在一个面板中,并将出生日期标签和文本字段放在另一个面板中,然后使基本面板边框布局和设置名称为北,生日日期为南. ..但是我仍然需要确保名称组件在名称面板中垂直居中,而birthdate组件在出生日期面板中垂直居中.

任何帮助表示赞赏.目标是确保名称组件行和出生日期组件行垂直展开,名称组件垂直居中于上半部分,出生日期组件垂直居中于下半部分.如果有什么问题让人感到困惑,请告诉我我会尝试改写以便更好地理解.

我正在使用严格的Java swing与eclipse,没有GUI构建器或类似的东西.

java swing layout-manager

8
推荐指数
2
解决办法
9416
查看次数

为什么JOptionPane中的JScrollPane没有显示其所有内容?

我试图将组件添加到JPanel,然后将此面板放入JScrollPane,然后将JScrollPane放入JOptionPane.

问题:只添加了19行组件.有一个for循环确定组件的行数,如果将条件计数器更改为19或更小,则将显示所有这些.

这是问题的SSCCE

import java.awt.Dimension;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class DynamicGroupLayout extends JPanel
{

    JButton addRecordButton;
    JTextField[] FieldsArray;
    JLabel[] LabelsArray;
    GroupLayout layout;
    JScrollPane scrollPane;

    public DynamicGroupLayout()
    {
        addRecordButton = new JButton("add record");
        layout = new GroupLayout(this);
        this.setLayout(layout);
        layout.setAutoCreateGaps(true);
        layout.setAutoCreateContainerGaps(true);

        scrollPane = new JScrollPane(this);
        scrollPane.getVerticalScrollBar().setUnitIncrement(16);
        scrollPane.setPreferredSize(this.getPreferredSize());

        setTextFields();
        showDialog();
    }

    @Override
    public Dimension getPreferredSize()
    {
        return new Dimension(400, 500);
    }

    private void setTextFields()
    {
        int num = 30;  //If …
Run Code Online (Sandbox Code Playgroud)

java swing jscrollpane joptionpane

6
推荐指数
1
解决办法
3878
查看次数

如何迭代地将组件添加到Swing GroupLayout ParallelGroup?

有没有办法迭代组件列表并将它们添加到Swing GroupLayout中的ParallelGroup?

这似乎很难,因为没有方法可以获得ParallelGroup.

以下是生成组件列表的代码(在本例中为JCheckBoxes).

List<JCheckBox> listCustomiseJCB = new ArrayList<>();
    for (int w = 0; w < initialCMTableColumns.size(); w++) {
        String heading = (String)initialCMTableColumns.get(w).getHeaderValue();
        listCustomiseJCB.add(new JCheckBox(heading));
    }
Run Code Online (Sandbox Code Playgroud)

列表正在工作,但我如何迭代List以将每个JCheckbox插入GroupLayout的ParallelGroup?例如,下面的代码将无法编译.

    GroupLayout gl = new GroupLayout(jpnlCustomise);
    jpnlCustomise.setLayout(gl);
    gl.setAutoCreateContainerGaps(true);
    gl.setAutoCreateGaps(true);

    GroupLayout.SequentialGroup hGroup = gl.createSequentialGroup();

    hGroup
            .addComponent(jbtnApply);
    hGroup.addGroup(gl.createParallelGroup(GroupLayout.Alignment.CENTER)
            // ERRORS BEGIN HERE
            { for (JCheckBox c: listCustomiseJCB) {
            .addComponent(c);
            }});
            // ERRORS END HERE
    hGroup
            .addComponent(jbtnCancel);

    gl.setHorizontalGroup(hGroup);
Run Code Online (Sandbox Code Playgroud)

或者,是否有人知道如何获取ParallelGroup以便我可以在独立的for循环中迭代地将组件添加到该组?

java swing grouplayout

5
推荐指数
1
解决办法
3553
查看次数

如何使用GroupLayout构建表单?

使用GroupLayout在Java中构建表单的最简单方法是什么?对于表单,我的意思是具有前面带有标签的文本字段.像这样的东西:

表格截图

java swing grouplayout

4
推荐指数
1
解决办法
7931
查看次数

将文本框放在单独的行中

MainClass(){
    JFrame main = new JFrame("Login Form ");
    main.setBounds(350,150,500,500);
    main.setVisible(true);
    main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    name = new JTextField(10);
    pass = new JTextField(10);
    main.setLayout(new GridLayout(0,1));
    JPanel pane = new JPanel();
    main.add(pane);
    main.add(new JLabel("Username: "));
    pane.add(name);
    //main.add(pane);
    pane.add(new JLabel("Password: "));
    pane.add(pass);
    submit = new JButton("Submit");
    pane.add(submit);
    submit.addActionListener(new Handler());
}
Run Code Online (Sandbox Code Playgroud)

我想在标签usernamename文本框之后的单独行中分隔文本框.我需要将光标控制到一个新行.

java swing textbox jtextarea layout-manager

3
推荐指数
1
解决办法
2万
查看次数

按边缘排列摆动组件

是否可以排列摆动组件?组件位于单独的面板中,两者都使用流动布局.这两个面板位于使用网格布局的另一个面板中.

图片

你可以看到有一个微妙的区别,我觉得很烦人.我知道所有的jlabels [蓝色/紫色的矩形都有相同的大小,所以我认为它可能是因为'+'和'*',但我不确定因为第一个的左边两个盒子没有排成一列.

面板

JPanel panel2 = new JPanel(new GridLayout(4, 1));
JPanel panel2a = new JPanel(new FlowLayout());
JPanel panel2b = new JPanel(new FlowLayout());
Run Code Online (Sandbox Code Playgroud)

前两个矩形(紫色)

add1 = new JLabel("", JLabel.CENTER);
add1.setTransferHandler(new TransferHandler("text"));
add1.setBorder(b2);
add2 = new JLabel("", JLabel.CENTER);
add2.setTransferHandler(new TransferHandler("text"));
add2.setBorder(b2);
Run Code Online (Sandbox Code Playgroud)

两个蓝色矩形

textFieldA = new JTextField();
textFieldA.setHorizontalAlignment(JTextField.CENTER);
textFieldA.setEditable(false);
textFieldA.setBorder(new LineBorder(Color.blue));
textFieldM = new JTextField();
textFieldM.setHorizontalAlignment(JTextField.CENTER);
textFieldM.setEditable(false);
textFieldM.setBorder(new LineBorder(Color.blue));
Run Code Online (Sandbox Code Playgroud)

+和*

opA = new JLabel("+", JLabel.CENTER);
opS = new JLabel("*", JLabel.CENTER);
Run Code Online (Sandbox Code Playgroud)

显示矩形大小相同

Dimension d = card1.getPreferredSize(); 
int width = d.width + 100;
int …
Run Code Online (Sandbox Code Playgroud)

java swing alignment vertical-alignment layout-manager

3
推荐指数
2
解决办法
336
查看次数

GroupLayout在NetBeans中自动生成代码

在java编程工作了近4年之后,我决定学习如何自己编写GUI类,因为到目前为止我一直使用NetBeans GUI编辑器(我并不为此感到特别自豪,但它已经很好地避免了我对组件的担心布局).

问题是我正在关注如何使用GroupLayout教程来了解我觉得非常强大的布局管理器.现在我自己做了一个小例子,然后尝试在Netbeans GUI Editor中做同样的事情,我发现两个代码之间存在一些差异,我想知道我是否遗漏了某些内容,或者NetBeans只是在GroupLayout定义中添加了无用的代码.

这是我的目标:

在此输入图像描述

这是我的SSCCE:

public static void main(String[] args) {        
    JLabel label = new JLabel("This is a test");
    label.setFont(new Font("Segoe UI Semibold", Font.BOLD | Font.ITALIC, 24));

    JSeparator separator = new JSeparator(JSeparator.HORIZONTAL);

    DefaultListModel model = new DefaultListModel();
    model.addElement("Apple");
    model.addElement("Orange");
    model.addElement("Kiwi");
    model.addElement("Watermelon");

    JList list = new JList(model);
    list.setPreferredSize(new Dimension(400, 300));
    JScrollPane scrollPane = new JScrollPane();
    scrollPane.setViewportView(list);

    JFrame frame = new JFrame("Test");
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);


    Container contentPane = frame.getContentPane();        
    GroupLayout layout = new GroupLayout(contentPane);
    layout.setAutoCreateContainerGaps(true);
    contentPane.setLayout(layout);

    layout.setHorizontalGroup(
            layout.createParallelGroup(GroupLayout.Alignment.LEADING) …
Run Code Online (Sandbox Code Playgroud)

java swing netbeans grouplayout

3
推荐指数
1
解决办法
2064
查看次数

如何将scrollPane放在BoxLayout上?

我想有我JFrame,有一个BoxLayout能够有一个滚动窗格,所以我可以刚在论坛加入一样,如果它是一个收据或发票打印机。有没有添加方法ScrollPane

问题:如何将ScrollPane添加到JFrame?

代码,最初在这里看到:

import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.GroupLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

/** @see /sf/answers/595332741/ */
public class GroupPanel extends JPanel {
    private static final long serialVersionUID = 1L;
    private JLabel label1     = new JLabel("Primary:");
    private JTextField field1 = new JTextField(16);
    private JLabel label2     = new JLabel("Secondary:");
    private JTextField field2 = new JTextField(16);
    private JLabel label3     = new JLabel("Tertiary:");
    private JTextField …
Run Code Online (Sandbox Code Playgroud)

java swing jpanel jscrollpane boxlayout

3
推荐指数
1
解决办法
2663
查看次数