我一直在努力为插入带有GridLayout的JPanel中的按钮设置特定大小。
按钮总是填满整个面板,而如果我删除了gridlayout,按钮将不会有相同的行为。
任何提示?
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);
}
}
}
}
答案 0 :(得分:8)
您的问题与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,按钮不会有相同的行为。
这是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);
或第三方LayoutManger
,例如MigLayout
。
其他建议:
不要再调用setPreferredSize(..)
而是覆盖getPreferredSize()
,甚至只在绘制到Graphic
对象或想要使组件变大/变小时才这样做不要这样做布局目的是LayoutManager
的工作。
还要记得通过SwingUtilities.invokeLater(Runnable r)
块<{3}}创建和操作Swing组件
答案 1 :(得分: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你可以设置你喜欢的按钮大小!
答案 2 :(得分: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));
答案 3 :(得分:0)
试试这个,它对我有用。
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);