2

我一直在努力为插入带有 GridLayout 的 JPanel 中的按钮设置特定大小。

该按钮总是填满整个面板,而如果我删除网格布局,该按钮将不会有相同的行为。

任何提示?

package panels;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class ColorDisplay {

private final int X = 100; 
private final int Y = 100;
private final Dimension PANEL_SIZE = new Dimension(500,500);
private JTextField textRed;
private JTextField textGreen;
private JTextField textBlue;
private JLabel labelText, labelRed, labelGreen, labelBlue;
private JPanel displayPanel;
private JPanel textPanel;
private JPanel buttonPanel;
private JButton button;
private final Font font = new Font("Arial", Font.PLAIN, 22);

public static void main(String[] args) {
    // TODO Auto-generated method stub

    new ColorDisplay();


}
public ColorDisplay(){
    JFrame mainFrame = new JFrame();

    // make sure the program exits when the frame close
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainFrame.setTitle("Color Display");
    mainFrame.setLocation(X,Y);
    mainFrame.setPreferredSize(PANEL_SIZE);

    // ensure an elastic layout
    mainFrame.setLayout(new GridLayout(3, 1));

    mainFrame.setLocationByPlatform(true);

    mainFrame.add(getColorPanel());
    mainFrame.add(getTextPanel());
    mainFrame.add(getButtonPanel());

    mainFrame.pack();
    mainFrame.setVisible(true);

}

public JPanel getColorPanel(){
    displayPanel = new JPanel(new BorderLayout());
    labelText = new JLabel("Color Display", JLabel.CENTER);
    Font fontColorDisplay = new Font("Arial", Font.PLAIN, 42);
    labelText.setFont(fontColorDisplay);

    displayPanel.add(labelText);

    return displayPanel;
}

public JPanel getTextPanel(){
    textPanel = new JPanel(new GridLayout(2,3));
    labelRed = new JLabel("Red", JLabel.CENTER);
    labelGreen = new JLabel("Green", JLabel.CENTER);
    labelBlue = new JLabel("Blue", JLabel.CENTER);
    textRed = new JTextField();
    textGreen = new JTextField();
    textBlue = new JTextField();

    labelRed.setFont(font);
    labelGreen.setFont(font);
    labelBlue.setFont(font);
    textRed.setFont(font);
    textGreen.setFont(font);
    textBlue.setFont(font);

    textPanel.add(labelRed);
    textPanel.add(labelGreen);
    textPanel.add(labelBlue);
    textPanel.add(textRed);
    textPanel.add(textGreen);
    textPanel.add(textBlue);

    return textPanel;
}

public JPanel getButtonPanel(){

    buttonPanel = new JPanel(new BorderLayout());
    button = new JButton("Display Color");
    button.addActionListener(new ButtonListener ()); // Add event handler
    button.setFont(font);
    button.setPreferredSize(new Dimension(100, 100));

    buttonPanel.add(button);
    return buttonPanel;

}

private int getColor(){

    String colorCode = textRed.getText() + textGreen.getText() + textBlue.getText();
    return Integer.parseInt(colorCode);
}

private boolean validateColor(String textValue){
    boolean isValid = false;
    try {
        int num1 = Integer.parseInt(textValue);
        if (num1 >= 0 && num1 <= 255)
            isValid = true;
        else
        {
            isValid = false;
            JOptionPane.showConfirmDialog(null, "Please enter numbers between 0 and 255", "Error", JOptionPane.PLAIN_MESSAGE);
        }
    } catch (NumberFormatException e) {
        JOptionPane.showConfirmDialog(null, "Please enter numerical values", "Error", JOptionPane.PLAIN_MESSAGE);
    }
    return isValid;


}
private class ButtonListener implements ActionListener { // Inner class
    public void actionPerformed(ActionEvent event) {

        if (validateColor(textRed.getText()) && validateColor(textGreen.getText()) && validateColor(textBlue.getText()))
        {
            Color bgColor = new Color(getColor());
            displayPanel.setBackground(bgColor);    
        }


    }
}
}
4

4 回答 4

9

您的问题是关于GridLayout但您使用以下方式显示代码BorderLayout

buttonPanel = new JPanel(new BorderLayout());
button = new JButton("Display Color");
button.addActionListener(new ButtonListener ()); // Add event handler
button.setFont(font);
button.setPreferredSize(new Dimension(100, 100));

?

该按钮总是填满整个面板,而如果我删除网格布局,该按钮将不会有相同的行为。

这是GridLayout默认行为,它的空间被平均分配,每个组件都占据了整个空间(同样适用于BorderLayout)。

还有许多其他LayoutManager可以满足您的需求:

您可能想看看GridBagLayout哪个更灵活:

buttonPanel = new JPanel(new GridBagLayout());
button = new JButton("Display Color");
button.addActionListener(new ButtonListener()); // Add event handler
button.setFont(font);


GridBagConstraints gc=new GridBagConstraints();
gc.fill=GridBagConstraints.HORIZONTAL;
gc.gridx=0;
gc.gridy=0;
            
buttonPanel.add(button,gc);

在此处输入图像描述

甚至是默认值JPanel FlowLayout

    buttonPanel = new JPanel();
    button = new JButton("Display Color");
    button.addActionListener(new ButtonListener()); // Add event handler
    button.setFont(font);

    buttonPanel.add(button);

在此处输入图像描述

LayoutMangerMigLayout.

其他建议:

  • 不要调用setPreferredSize(..)而不是覆盖getPreferredSize(),甚至不仅仅在绘制到Graphics 对象或想要使组件更大/更小时这样做,不要出于布局目的这样做,这是一项LayoutManager工作。

  • 还要永远记住通过块在事件调度线程上创建和操作 Swing 组件SwingUtilities.invokeLater(Runnable r)

于 2013-01-27T17:53:20.397 回答
2

用此方法替换您的 getButtonPanel() (我使用 GroupLayout 使其工作),

public JPanel getButtonPanel(){

    JPanel jPanel1 = new JPanel();
    button = new JButton("Display Color");
    button.addActionListener(new ButtonListener ()); // Add event handler
    button.setFont(font);
    javax.swing.GroupLayout jPanel1Layoutx = new javax.swing.GroupLayout(jPanel1);
                    jPanel1.setLayout(jPanel1Layoutx);
                    jPanel1Layoutx.setHorizontalGroup(
                            jPanel1Layoutx.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel1Layoutx.createSequentialGroup().addContainerGap().addComponent(button, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));
                    jPanel1Layoutx.setVerticalGroup(
                            jPanel1Layoutx.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel1Layoutx.createSequentialGroup().addComponent(button, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE).addGap(0, 12, Short.MAX_VALUE)));

    return jPanel1;

}

您可以设置您喜欢的按钮大小,而不是 24!

于 2013-01-27T18:03:13.090 回答
1

试试这个,它对我有用。

JFrame frame=new JFrame();
JPanel p1 = new JPanel(new GridLayout(2,1));
JLabel lb1= new JLabel("Test1");
JButton button1 = new JButton("Go to whatever");
button1.addActionListener();
JPanel p2=new JPanel();
p2.add(button1);
p1.add(p2);
frame.add(p1);
于 2016-05-05T14:59:31.510 回答
0

只需创建一个 JPanel,然后将该 JPanel 添加到框架的布局中。现在在 JPanel 中,我们将其称为 holderPanel,添加按钮。现在按钮不会占用整个空间!随意执行以下一些操作以更好地适应您的程序:

  • holderPanel.setOpaque(false); //So the panel is invisible, but your button is
  • holderPanel.setBorder(new EmptyBorder(80, 50, 20, 130));
于 2013-04-24T02:20:05.300 回答