JButtons innerhalb JPanels füllen bis die ganze Tafel
Ich habe gekämpft, um eine bestimmte Größe, um eine Schaltfläche eingefügt in ein JPanel mit einem GridLayout.
Den button füllt immer bis die ganze Tafel, in der Erwägung, dass, wenn ich entfernen Sie die gridlayout-Objekt, das die Schaltfläche nicht das gleiche Verhalten.
irgendwelche Tipps?
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);
}
}
}
}
InformationsquelleAutor pelican_george | 2013-01-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Frage über
GridLayout
aber Sie zeigen code mitBorderLayout
:?
Dies ist
GridLayout
Standardverhalten, Platz gleichmäßig aufgeteilt und jede Komponente nimmt den ganzen Raum (Gleiches würde gelten fürBorderLayout
).Gibt es viele andere
LayoutManager
s, die Ihren Bedürfnissen gerecht wird:Möchten Sie vielleicht zu schauen,
GridBagLayout
, die ist flexibler:oder auch die Standard -
JPanel
FlowLayout
:Oder eine 3rd-party -
LayoutManger
wieMigLayout
.Andere Vorschläge:
Dont call
setPreferredSize(..)
eher überschreibengetPreferredSize()
und selbst als dies nur tun, wenn die Malerei und dieGraphic
s Objekt oder wollen, um eine Komponente größer/kleiner nicht tun dies für Layout-Zwecke, das ist eineLayoutManager
s job.Auch immer daran denken, zu erstellen und zu manipulieren Swing-Komponenten auf dem Event-Dispatch-Thread über
SwingUtilities.invokeLater(Runnable r)
blockInformationsquelleAutor David Kroukamp
Ersetzen Sie Ihre getButtonPanel() mit dieser Methode ( ich habe GroupLayout, damit es funktioniert),
Statt 24 u set-Taste Größe, dass u lieber !
GroupLayout
war wirklich beabsichtigte für IDE verwenden. Seine sehr mächtig, aber zu Komplex für einfache AufgabenInformationsquelleAutor c.pramod
Erstellen Sie einfach ein JPanel und füge das JPanel auf das layout des Rahmens. Jetzt in das JPanel, nennen wir es holderPanel Sie die Schaltfläche hinzufügen. Jetzt ist der button nicht nehmen den gesamten Raum! Fühlen Sie sich frei, um das folgende besser zu suite-Ihr Programm:
holderPanel.setOpaque(false); //So the panel is invisible, but your button is
holderPanel.setBorder(new EmptyBorder(80, 50, 20, 130));
InformationsquelleAutor DarrenKing
Dieser versuchen, bei mir hat es geklappt.
InformationsquelleAutor MMSA