Java Swing GridBagLayout JTextField 添加错误消息后更改大小
Java Swing GridBagLayout JTextField Changing size after adding error message
我已经追查这个错误一段时间了,但似乎无法弄清楚。我有一个带有标签和文本字段列表的小型 GUI。在具有标签 + 文本字段的行之间,有一个包含 JLabel 的空行以根据需要填充错误消息。问题是,当此错误消息出现时,它们上方的文本字段出于某种原因被压缩,并且在尝试不同的东西几个小时后,我似乎无法查明原因。似乎所有 labels/text 区域相互之间也略有压缩。谁能指出问题所在?
我已经尝试在面板网格布局中为每个元素提供更多 space。这似乎并没有改变最终结果。
如果查看代码,元素位于“continuousTransferPanel”上 "singleTransferPanel" 也有同样的问题,只有 2 行。
public void modifyJobWindow()
{
setTitle("Job Editor");
this.setMinimumSize(new Dimension(350, 400));
this.setSize(350, 300);
this.setResizable(false);
JPanel basePanel = new JPanel();
getContentPane().add(basePanel, BorderLayout.CENTER);
basePanel.setLayout(new BorderLayout(0, 0));
JPanel mainPanel = new JPanel();
basePanel.add(mainPanel, BorderLayout.CENTER);
mainPanel.setBackground(new Color(49, 49, 47));
mainPanel.setLayout(new BorderLayout(0, 0));
JPanel optionPanel = new JPanel();
optionPanel.setBackground(new Color(49, 49, 47));
mainPanel.add(optionPanel, BorderLayout.NORTH);
JLabel transferLabel = new JLabel("Transfer Type: ");
transferLabel.setHorizontalAlignment(SwingConstants.LEFT);
transferLabel.setFont(new Font("Arial", Font.BOLD, 16));
transferLabel.setForeground(Color.WHITE);
optionPanel.add(transferLabel);
comboBox = new JComboBox();
comboBox.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if (comboBox.getSelectedItem().equals("Single File Transfer"))
{
acceptButton.setEnabled(true);
continuousTransferPanel.setVisible(false);
deleteSourceCheckBox.setSelected(false);
deleteSourceCheckBox.setEnabled(true);
deleteSourceCheckBox.setForeground(Color.WHITE);
autostartCheckBox.setSelected(false);
autostartCheckBox.setEnabled(false);
autostartCheckBox.setForeground(Color.GRAY);
singleTransferPanel.setVisible(true);
clearErrors();
}
else if (comboBox.getSelectedItem().equals("Continuous File Transfer"))
{
acceptButton.setEnabled(true);
deleteSourceCheckBox.setSelected(false);
deleteSourceCheckBox.setEnabled(true);
deleteSourceCheckBox.setForeground(Color.WHITE);
singleTransferPanel.setVisible(false);
autostartCheckBox.setEnabled(true);
autostartCheckBox.setForeground(Color.WHITE);
continuousTransferPanel.setVisible(true);
clearErrors();
}
else
{
acceptButton.setEnabled(false);
deleteSourceCheckBox.setSelected(false);
deleteSourceCheckBox.setEnabled(false);
deleteSourceCheckBox.setForeground(Color.GRAY);
autostartCheckBox.setSelected(false);
autostartCheckBox.setEnabled(false);
autostartCheckBox.setForeground(Color.GRAY);
singleTransferPanel.setVisible(false);
continuousTransferPanel.setVisible(false);
clearErrors();
}
}
});
comboBox.setModel(new DefaultComboBoxModel(new String[] {"", "Single File Transfer", "Continuous File Transfer"}));
comboBox.setMaximumRowCount(3);
optionPanel.add(comboBox);
JPanel subMainPanel = new JPanel();
subMainPanel.setBackground(new Color(49, 49, 47));
mainPanel.add(subMainPanel, BorderLayout.CENTER);
GridBagLayout gbl_subMainpanel = new GridBagLayout();
gbl_subMainpanel.columnWidths = new int[] {400};
gbl_subMainpanel.rowHeights = new int[] {175};
gbl_subMainpanel.columnWeights = new double[] {1.0};
gbl_subMainpanel.rowWeights = new double[] {0.0, Double.MIN_VALUE};
subMainPanel.setLayout(gbl_subMainpanel);
continuousTransferPanel = new JPanel();
GridBagConstraints gbc_continuousTransferPanel = new GridBagConstraints();
gbc_continuousTransferPanel.anchor = GridBagConstraints.NORTH;
gbc_continuousTransferPanel.fill = GridBagConstraints.HORIZONTAL;
gbc_continuousTransferPanel.gridx = 0;
gbc_continuousTransferPanel.gridy = 0;
subMainPanel.add(continuousTransferPanel, gbc_continuousTransferPanel);
continuousTransferPanel.setBackground(new Color(49, 49, 47));
GridBagLayout gbl_continuousTransferPanel = new GridBagLayout();
gbl_continuousTransferPanel.columnWidths = new int[] {100, 300};
gbl_continuousTransferPanel.rowHeights = new int[] {25, 15, 25, 15, 25, 15, 25, 15};
gbl_continuousTransferPanel.columnWeights = new double[] {0.0, 1.0};
gbl_continuousTransferPanel.rowWeights = new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
continuousTransferPanel.setLayout(gbl_continuousTransferPanel);
continuousTransferPanel.setVisible(false);
JLabel jobCNameLabel = new JLabel("Job Name:");
jobCNameLabel.setFont(new Font("Arial", Font.BOLD, 12));
jobCNameLabel.setForeground(Color.WHITE);
GridBagConstraints gbc_jobCNameLabel = new GridBagConstraints();
gbc_jobCNameLabel.anchor = GridBagConstraints.WEST;
gbc_jobCNameLabel.insets = new Insets(5, 5, 0, 5);
gbc_jobCNameLabel.gridx = 0;
gbc_jobCNameLabel.gridy = 0;
continuousTransferPanel.add(jobCNameLabel, gbc_jobCNameLabel);
JLabel sourceCLabel = new JLabel("Source Folder:");
sourceCLabel.setFont(new Font("Arial", Font.BOLD, 12));
sourceCLabel.setForeground(Color.WHITE);
GridBagConstraints gbc_sourceCLabel = new GridBagConstraints();
gbc_sourceCLabel.anchor = GridBagConstraints.WEST;
gbc_sourceCLabel.insets = new Insets(5, 5, 0, 5);
gbc_sourceCLabel.gridx = 0;
gbc_sourceCLabel.gridy = 2;
continuousTransferPanel.add(sourceCLabel, gbc_sourceCLabel);
JLabel destCLabel = new JLabel("Destination:");
destCLabel.setForeground(Color.WHITE);
destCLabel.setFont(new Font("Arial", Font.BOLD, 12));
GridBagConstraints gbc_destCLabel = new GridBagConstraints();
gbc_destCLabel.insets = new Insets(5, 5, 0, 5);
gbc_destCLabel.anchor = GridBagConstraints.WEST;
gbc_destCLabel.gridx = 0;
gbc_destCLabel.gridy = 4;
continuousTransferPanel.add(destCLabel, gbc_destCLabel);
JLabel fileFilterLabel = new JLabel("File Regex:");
fileFilterLabel.setForeground(Color.WHITE);
fileFilterLabel.setFont(new Font("Arial", Font.BOLD, 12));
GridBagConstraints gbc_fileFilterLabel = new GridBagConstraints();
gbc_fileFilterLabel.insets = new Insets(5, 5, 0, 5);
gbc_fileFilterLabel.anchor = GridBagConstraints.WEST;
gbc_fileFilterLabel.gridx = 0;
gbc_fileFilterLabel.gridy = 6;
continuousTransferPanel.add(fileFilterLabel, gbc_fileFilterLabel);
jobCNameField = new JTextField();
jobCNameField.setBorder(defaultBorder);
GridBagConstraints gbc_jobCNameField = new GridBagConstraints();
gbc_jobCNameField.insets = new Insets(5, 0, 0, 5);
gbc_jobCNameField.fill = GridBagConstraints.HORIZONTAL;
gbc_jobCNameField.gridx = 1;
gbc_jobCNameField.gridy = 0;
continuousTransferPanel.add(jobCNameField, gbc_jobCNameField);
errorFieldCJobName = new JLabel("");
errorFieldCJobName.setFont(new Font("Arial", Font.BOLD, 8));
errorFieldCJobName.setForeground(Color.RED);
GridBagConstraints gbc_errorFieldCJobName = new GridBagConstraints();
gbc_errorFieldCJobName.anchor = GridBagConstraints.WEST;
gbc_errorFieldCJobName.insets = new Insets(0, 5, 0, 5);
gbc_errorFieldCJobName.gridx = 1;
gbc_errorFieldCJobName.gridy = 1;
continuousTransferPanel.add(errorFieldCJobName, gbc_errorFieldCJobName);
sourceCField = new JTextField();
sourceCField.setBorder(defaultBorder);
GridBagConstraints gbc_sourceCField = new GridBagConstraints();
gbc_sourceCField.insets = new Insets(5, 0, 0, 5);
gbc_sourceCField.fill = GridBagConstraints.HORIZONTAL;
gbc_sourceCField.gridx = 1;
gbc_sourceCField.gridy = 2;
continuousTransferPanel.add(sourceCField, gbc_sourceCField);
errorFieldCSourceField = new JLabel("");
errorFieldCSourceField.setFont(new Font("Arial", Font.BOLD, 8));
errorFieldCSourceField.setForeground(Color.RED);
GridBagConstraints gbc_errorFieldCSourceField = new GridBagConstraints();
gbc_errorFieldCSourceField.anchor = GridBagConstraints.WEST;
gbc_errorFieldCSourceField.insets = new Insets(0, 5, 0, 5);
gbc_errorFieldCSourceField.gridx = 1;
gbc_errorFieldCSourceField.gridy = 3;
continuousTransferPanel.add(errorFieldCSourceField, gbc_errorFieldCSourceField);
destCField = new JTextField();
destCField.setBorder(defaultBorder);
GridBagConstraints gbc_destCField = new GridBagConstraints();
gbc_destCField.insets = new Insets(5, 0, 0, 5);
gbc_destCField.fill = GridBagConstraints.HORIZONTAL;
gbc_destCField.gridx = 1;
gbc_destCField.gridy = 4;
continuousTransferPanel.add(destCField, gbc_destCField);
errorFieldCDest = new JLabel("");
errorFieldCDest.setFont(new Font("Arial", Font.BOLD, 8));
errorFieldCDest.setForeground(Color.RED);
GridBagConstraints gbc_errorFieldCDest = new GridBagConstraints();
gbc_errorFieldCDest.anchor = GridBagConstraints.WEST;
gbc_errorFieldCDest.insets = new Insets(0, 5, 0, 5);
gbc_errorFieldCDest.gridx = 1;
gbc_errorFieldCDest.gridy = 5;
continuousTransferPanel.add(errorFieldCDest, gbc_errorFieldCDest);
fileFilterField = new JTextField();
fileFilterField.setBorder(defaultBorder);
GridBagConstraints gbc_fileFilterField = new GridBagConstraints();
gbc_fileFilterField.insets = new Insets(5, 0, 0, 5);
gbc_fileFilterField.fill = GridBagConstraints.HORIZONTAL;
gbc_fileFilterField.gridx = 1;
gbc_fileFilterField.gridy = 6;
continuousTransferPanel.add(fileFilterField, gbc_fileFilterField);
errorFieldFileRegex = new JLabel("");
errorFieldFileRegex.setFont(new Font("Arial", Font.BOLD, 8));
errorFieldFileRegex.setForeground(Color.RED);
GridBagConstraints gbc_errorFieldFileRegex = new GridBagConstraints();
gbc_errorFieldFileRegex.anchor = GridBagConstraints.WEST;
gbc_errorFieldFileRegex.insets = new Insets(0, 5, 0, 5);
gbc_errorFieldFileRegex.gridx = 1;
gbc_errorFieldFileRegex.gridy = 7;
continuousTransferPanel.add(errorFieldFileRegex, gbc_errorFieldFileRegex);
singleTransferPanel = new JPanel();
GridBagConstraints gbc_singleTransferPanel = new GridBagConstraints();
gbc_singleTransferPanel.anchor = GridBagConstraints.NORTH;
gbc_singleTransferPanel.fill = GridBagConstraints.HORIZONTAL;
gbc_singleTransferPanel.gridx = 0;
gbc_singleTransferPanel.gridy = 0;
subMainPanel.add(singleTransferPanel, gbc_singleTransferPanel);
singleTransferPanel.setBackground(new Color(49, 49, 47));
GridBagLayout gbl_singleTransferPanel = new GridBagLayout();
gbl_singleTransferPanel.columnWidths = new int[] {100, 200};
gbl_singleTransferPanel.rowHeights = new int[] {30, 15, 30, 15};
gbl_singleTransferPanel.columnWeights = new double[] {0.0, 1.0};
gbl_singleTransferPanel.rowWeights = new double[] {0.0, 0.0, 0.0, 0.0};
singleTransferPanel.setLayout(gbl_singleTransferPanel);
singleTransferPanel.setVisible(false);
JLabel sourceLabel = new JLabel("Source File:");
sourceLabel.setFont(new Font("Arial", Font.BOLD, 12));
sourceLabel.setForeground(Color.WHITE);
GridBagConstraints gbc_sourceLabel = new GridBagConstraints();
gbc_sourceLabel.anchor = GridBagConstraints.WEST;
gbc_sourceLabel.insets = new Insets(5, 5, 0, 5);
gbc_sourceLabel.gridx = 0;
gbc_sourceLabel.gridy = 0;
singleTransferPanel.add(sourceLabel, gbc_sourceLabel);
JLabel destLabel = new JLabel("Destination:");
destLabel.setForeground(Color.WHITE);
destLabel.setFont(new Font("Arial", Font.BOLD, 12));
GridBagConstraints gbc_destLabel = new GridBagConstraints();
gbc_destLabel.insets = new Insets(5, 5, 0, 5);
gbc_destLabel.anchor = GridBagConstraints.WEST;
gbc_destLabel.gridx = 0;
gbc_destLabel.gridy = 2;
singleTransferPanel.add(destLabel, gbc_destLabel);
sourceField = new JTextField();
sourceField.setBorder(defaultBorder);
GridBagConstraints gbc_sourceField = new GridBagConstraints();
gbc_sourceField.insets = new Insets(5, 0, 0, 5);
gbc_sourceField.fill = GridBagConstraints.HORIZONTAL;
gbc_sourceField.gridx = 1;
gbc_sourceField.gridy = 0;
singleTransferPanel.add(sourceField, gbc_sourceField);
errorFieldSourceField = new JLabel("");
errorFieldSourceField.setFont(new Font("Arial", Font.BOLD, 8));
errorFieldSourceField.setForeground(Color.RED);
GridBagConstraints gbc_errorFieldSourceField = new GridBagConstraints();
gbc_errorFieldSourceField.anchor = GridBagConstraints.WEST;
gbc_errorFieldSourceField.insets = new Insets(0, 5, 0, 5);
gbc_errorFieldSourceField.gridx = 1;
gbc_errorFieldSourceField.gridy = 1;
singleTransferPanel.add(errorFieldSourceField, gbc_errorFieldSourceField);
destField = new JTextField();
destField.setBorder(defaultBorder);
GridBagConstraints gbc_destField = new GridBagConstraints();
gbc_destField.insets = new Insets(5, 0, 0, 5);
gbc_destField.fill = GridBagConstraints.HORIZONTAL;
gbc_destField.gridx = 1;
gbc_destField.gridy = 2;
singleTransferPanel.add(destField, gbc_destField);
errorFieldDest = new JLabel("");
errorFieldDest.setFont(new Font("Arial", Font.BOLD, 8));
errorFieldDest.setForeground(Color.RED);
GridBagConstraints gbc_errorFieldDest = new GridBagConstraints();
gbc_errorFieldDest.anchor = GridBagConstraints.WEST;
gbc_errorFieldDest.insets = new Insets(0, 5, 0, 5);
gbc_errorFieldDest.gridx = 1;
gbc_errorFieldDest.gridy = 3;
singleTransferPanel.add(errorFieldDest, gbc_errorFieldDest);
JPanel titlePanel = new JPanel();
basePanel.add(titlePanel, BorderLayout.NORTH);
titlePanel.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
titlePanel.setBackground(new Color(49, 49, 47));
titlePanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
JLabel titleLabel = new JLabel("File Transfer Job Editor");
titleLabel.setForeground(new Color(243, 112, 33));
titleLabel.setFont(new Font("Arial", Font.BOLD, 28));
titlePanel.add(titleLabel);
JPanel buttonPanel = new JPanel();
basePanel.add(buttonPanel, BorderLayout.SOUTH);
buttonPanel.setBorder(new BevelBorder(BevelBorder.RAISED, null, null, null, null));
GridBagLayout gbl_buttonPanel = new GridBagLayout();
gbl_buttonPanel.columnWidths = new int[] {175, 175, 0};
gbl_buttonPanel.rowHeights = new int[] {30, 30, 0};
gbl_buttonPanel.columnWeights = new double[] {1.0, 1.0, Double.MIN_VALUE};
gbl_buttonPanel.rowWeights = new double[] {0.0, 0.0, Double.MIN_VALUE};
buttonPanel.setBackground(new Color(49, 49, 47));
buttonPanel.setLayout(gbl_buttonPanel);
autostartCheckBox = new JCheckBox("Auto Start");
autostartCheckBox.setForeground(Color.gray);
autostartCheckBox.setEnabled(false);
autostartCheckBox.setHorizontalAlignment(SwingConstants.CENTER);
autostartCheckBox.setFont(new Font("Calibri", Font.BOLD, 16));
autostartCheckBox.setBackground(new Color(49, 49, 47));
GridBagConstraints gbc_autostartCheckBox = new GridBagConstraints();
gbc_autostartCheckBox.gridwidth = 1;
gbc_autostartCheckBox.fill = GridBagConstraints.VERTICAL;
gbc_autostartCheckBox.insets = new Insets(0, 0, 5, 5);
gbc_autostartCheckBox.gridx = 0;
gbc_autostartCheckBox.gridy = 0;
buttonPanel.add(autostartCheckBox, gbc_autostartCheckBox);
deleteSourceCheckBox = new JCheckBox("Delete Source File");
deleteSourceCheckBox.setHorizontalAlignment(SwingConstants.CENTER);
deleteSourceCheckBox.setForeground(Color.WHITE);
deleteSourceCheckBox.setEnabled(false);
deleteSourceCheckBox.setForeground(Color.gray);
deleteSourceCheckBox.setFont(new Font("Calibri", Font.BOLD, 16));
deleteSourceCheckBox.setBackground(new Color(49, 49, 47));
GridBagConstraints gbc_deleteSourceCheckBox = new GridBagConstraints();
gbc_deleteSourceCheckBox.gridwidth = 1;
gbc_deleteSourceCheckBox.fill = GridBagConstraints.VERTICAL;
gbc_deleteSourceCheckBox.insets = new Insets(0, 0, 5, 5);
gbc_deleteSourceCheckBox.gridx = 1;
gbc_deleteSourceCheckBox.gridy = 0;
buttonPanel.add(deleteSourceCheckBox, gbc_deleteSourceCheckBox);
JButton cancelButton = new JButton("Cancel");
cancelButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
close();
}
});
cancelButton.setFont(new Font("Calibri", Font.BOLD, 14));
cancelButton.setPreferredSize(new Dimension(100, 30));
GridBagConstraints gbc_generateButton = new GridBagConstraints();
gbc_generateButton.insets = new Insets(0, 0, 10, 0);
gbc_generateButton.gridx = 0;
gbc_generateButton.gridy = 1;
buttonPanel.add(cancelButton, gbc_generateButton);
acceptButton = new JButton("Accept");
acceptButton.setEnabled(false);
acceptButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent arg0)
{
success = true;
if (comboBox.getSelectedItem().equals("Single File Transfer"))
{
if (sourceField.getText().length() > 0)
{
File sourceCheck = new File(sourceField.getText());
if (sourceCheck.exists() && sourceCheck.isFile())
{
// Success
sourceField.setBorder(defaultBorder);
errorFieldSourceField.setText("");
}
else
{
sourceField.setBorder(BorderFactory.createLineBorder(Color.red));
errorFieldSourceField.setText("File does not exist.");
success = false;
}
}
else
{
sourceField.setBorder(BorderFactory.createLineBorder(Color.red));
errorFieldSourceField.setText("Cannot be empty.");
success = false;
}
if (destField.getText().length() > 0)
{
destField.setBorder(defaultBorder);
errorFieldDest.setText("");
}
else
{
destField.setBorder(BorderFactory.createLineBorder(Color.red));
errorFieldDest.setText("Cannot be empty.");
success = false;
}
if (success == true)
{
Job newJob = new Job("SingleJob", sourceField.getText(), destField.getText(), null, deleteSourceCheckBox.isSelected(), true);
// TODO: Start Job
}
}
else if (comboBox.getSelectedItem().equals("Continuous File Transfer"))
{
success = true;
if (jobCNameField.getText().length() > 0)
{
File jobNameCheck = new File("jobs/" + jobCNameField.getText() + ".job");
if (jobNameCheck.exists() && modify == false)
{
jobCNameField.setBorder(BorderFactory.createLineBorder(Color.red));
errorFieldCJobName.setText("Job name already exists.");
success = false;
}
else
{
// Success
jobCNameField.setBorder(defaultBorder);
errorFieldCJobName.setText("");
}
}
else
{
jobCNameField.setBorder(BorderFactory.createLineBorder(Color.red));
errorFieldCJobName.setText("Cannot be empty.");
success = false;
}
if (sourceCField.getText().length() > 0)
{
File sourceCheck = new File(sourceCField.getText());
if (sourceCheck.exists() && sourceCheck.isDirectory())
{
// Success
sourceCField.setBorder(defaultBorder);
errorFieldCSourceField.setText("");
}
else
{
sourceCField.setBorder(BorderFactory.createLineBorder(Color.red));
errorFieldCSourceField.setText("Directory does not exist.");
success = false;
}
}
else
{
sourceCField.setBorder(BorderFactory.createLineBorder(Color.red));
errorFieldCSourceField.setText("Cannot be empty.");
success = false;
}
if (destCField.getText().length() > 0)
{
destCField.setBorder(defaultBorder);
errorFieldCDest.setText("");
}
else
{
destCField.setBorder(BorderFactory.createLineBorder(Color.red));
errorFieldCDest.setText("Cannot be empty.");
success = false;
}
try
{
Pattern.compile(fileFilterField.getText());
errorFieldFileRegex.setText("");
fileFilterField.setBorder(defaultBorder);
}
catch (PatternSyntaxException exception)
{
fileFilterField.setBorder(BorderFactory.createLineBorder(Color.red));
errorFieldFileRegex.setText("Invalid syntax.");
success = false;
}
if (success == true)
{
if (modify)
{
FileTransferUtility.jobList.remove(originalJob);
FileTransferGUI.clearJobFromTable(originalJob);
// TODO: Stop if running
}
if (comboBox.getSelectedItem().equals("Continuous File Transfer"))
{
Job newJob = new Job(jobCNameField.getText(), sourceCField.getText(), destCField.getText(), fileFilterField.getText(), deleteSourceCheckBox.isSelected(),
autostartCheckBox.isSelected());
JobHandler newJobHandler = new JobHandler(newJob);
FileTransferUtility.jobList.add(newJobHandler);
newJob.writeToFile("/jobs");
FileTransferGUI.addJobToTable(newJobHandler);
if (autostartCheckBox.isSelected())
{
// TODO: Start Job
}
}
close();
}
}
}
});
acceptButton.setPreferredSize(new Dimension(100, 30));
acceptButton.setFont(new Font("Calibri", Font.BOLD, 14));
GridBagConstraints gbc_closeButton = new GridBagConstraints();
gbc_closeButton.insets = new Insets(0, 0, 10, 0);
gbc_closeButton.gridx = 1;
gbc_closeButton.gridy = 1;
buttonPanel.add(acceptButton, gbc_closeButton);
JPanel entryPanel = new JPanel();
entryPanel.setBorder(null);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.pack();
this.setVisible(true);
}
不是真正的答案,但我无法通过 MCVE 尝试重现您的问题。注意使用数组和集合(这里是映射)来简化代码:
import java.awt.*;
import java.awt.event.*;
import java.util.HashMap;
import java.util.Map;
import javax.swing.*;
@SuppressWarnings("serial")
public class MyPanel extends JPanel {
public static final String[] LABELS = {"Job Name:", "Source Folder:", "Destination:", "File Regex:"};
private static final int TF_COLS = 20;
private static final Font LABEL_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 12);
private static final Font ERROR_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 8);
private static final String ERROR_MESSAGE = "Cannot Be Empty";
private static final Color BACKGROUND = new Color(49, 49, 47);
private Map<String, JTextField> labelFieldMap = new HashMap<>();
private Map<String, JLabel> errorLabelMap = new HashMap<>();
public MyPanel() {
setLayout(new BorderLayout());
setBackground(BACKGROUND);
JPanel labelFieldPanel = new JPanel(new GridBagLayout());
labelFieldPanel.setOpaque(false);
for (int i = 0; i < LABELS.length; i++) {
String text = LABELS[i];
JLabel label = new JLabel(text);
JTextField textField = new JTextField(TF_COLS);
JLabel errorLabel = new JLabel(" ");
label.setFont(LABEL_FONT);
label.setForeground(Color.WHITE);
errorLabel.setFont(ERROR_FONT);
errorLabel.setForeground(Color.RED);
labelFieldMap.put(text, textField);
errorLabelMap.put(text, errorLabel);
GridBagConstraints gbc = createLabelConstraint(i);
labelFieldPanel.add(label, gbc);
gbc = createTextFieldConstraints(i);
labelFieldPanel.add(textField, gbc);
gbc = createErrorLabelConstraints(i);
labelFieldPanel.add(errorLabel, gbc);
// add blank JLabel at the 0 position
gbc.gridx = 0;
labelFieldPanel.add(new JLabel(), gbc);
}
JButton acceptButton = new JButton("Accept");
acceptButton.setMnemonic(KeyEvent.VK_A);
acceptButton.addActionListener(e -> {
for (int i = 0; i < LABELS.length - 1; i++) {
String text = LABELS[i];
JTextField textField = labelFieldMap.get(text);
JLabel errorLabel = errorLabelMap.get(text);
if (textField.getText().trim().isEmpty()) {
errorLabel.setText(ERROR_MESSAGE);
} else {
errorLabel.setText(" ");
System.out.println(text + " " + textField.getText());
}
}
System.out.println();
});
JPanel btnPanel = new JPanel();
btnPanel.setOpaque(false);
btnPanel.add(acceptButton);
add(labelFieldPanel, BorderLayout.CENTER);
add(btnPanel, BorderLayout.PAGE_END);
}
private GridBagConstraints createErrorLabelConstraints(int i) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 2 * i + 1;
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(0, 5, 0, 5);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1.0;
gbc.weighty = 0.0;
return gbc;
}
private GridBagConstraints createTextFieldConstraints(int i) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 2 * i;
gbc.anchor = GridBagConstraints.EAST;
gbc.insets = new Insets(5, 0, 0, 5);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1.0;
gbc.weighty = 0.0;
return gbc;
}
private GridBagConstraints createLabelConstraint(int i) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 2 * i;
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(5, 5, 0, 5);
gbc.weightx = 0.0;
gbc.weighty = 0.0;
return gbc;
}
private static void createAndShowGui() {
MyPanel mainPanel = new MyPanel();
JFrame frame = new JFrame("MyPanel");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
生成的 GUI:
由于问题出在您的 JTextField 的边框上,并且由于您无法在没有 运行 的情况下完全重置默认边框,因此一种解决方案是为您的 JTextField 创建一个 CompoundBorder,外边框为 LineBorder它使用与 JPanel 的背景颜色相同的颜色,内部边框是 JTextField 的默认边框。然后在你的动作侦听器中,简单地创建一个新的复合边框,一个使用 Color.RED 外边框的边框。
所以在下面的示例中创建我的 JTextFields 时,我还创建了一个 CompoundBorder,给它一个 outerBorder 和 innerBorder,如下所示:
// create JTextField with TF_COLS int column count value
JTextField textField = new JTextField(TF_COLS);
// get the JTextField's default border and make it our inner border
Border innerBorder = textField.getBorder();
// create an outer LineBorder that uses the JPanel's background color
Border outerBorder = BorderFactory.createLineBorder(BACKGROUND);
// create the compound border with these two borders
CompoundBorder myBorder = BorderFactory.createCompoundBorder(outerBorder, innerBorder);
// and set the JTextField's border with it
textField.setBorder(myBorder);
然后在 JButton 的 ActionListener 中,获取 JTextField 的当前边框,我们的复合边框,并更改外边框的线条颜色。简单:
// loop through all the JLabel texts
for (int i = 0; i < LABELS.length; i++) {
String text = LABELS[i]; // get the array item
// use it to get the JTextField associated with this String
JTextField textField = labelFieldMap.get(text);
// same for the error JLabel
JLabel errorLabel = errorLabelMap.get(text);
// get our current JTextField's border which is a compound border
CompoundBorder myBorder = (CompoundBorder) textField.getBorder();
// the insideBorder, the original JTextField's border, will be unchanged
Border insideBorder = myBorder.getInsideBorder();
// if the text field is empty (and not the last jtext field)
if (i < LABELS.length - 1 && textField.getText().trim().isEmpty()) {
errorLabel.setText(ERROR_MESSAGE); // set the error JLabel
// set txt field's color if we want
textField.setBackground(ERROR_BG_COLOR);
// okToTransfer = false;
// create a compound border, the outer border now a line border, RED
Border outsideBorder = BorderFactory.createLineBorder(Color.RED);
CompoundBorder newBorder = BorderFactory.createCompoundBorder(outsideBorder, insideBorder);
// set the JTextField's border to this one
textField.setBorder(newBorder);
} else {
// else all OK
errorLabel.setText(" ");
textField.setBackground(Color.WHITE);
// set the JTextField's border back to our original compound border
Border outsideBorder = BorderFactory.createLineBorder(BACKGROUND);
CompoundBorder newBorder = BorderFactory.createCompoundBorder(outsideBorder,
insideBorder);
textField.setBorder(newBorder);
}
System.out.println(text + " " + textField.getText());
}
例如:
import java.awt.*;
import java.awt.Dialog.ModalityType;
import java.awt.event.*;
import java.util.HashMap;
import java.util.Map;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
@SuppressWarnings("serial")
public class MyPanel extends JPanel {
public static final String[] LABELS = { "Job Name:", "Source Folder:", "Destination:",
"File Regex:" };
private static final int TF_COLS = 30;
private static final Font LABEL_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 12);
private static final Font ERROR_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 8);
private static final String ERROR_MESSAGE = "Cannot Be Empty";
private static final Color BACKGROUND = new Color(49, 49, 47);
private static final String TITLE = "File Transfer Job Editor";
private static final Color TITLE_COLOR = new Color(243, 112, 33);
private static final Font TITLE_FONT = new Font("Arial", Font.BOLD, 28);
private static final Color ERROR_BG_COLOR = new Color(255, 220, 220);
private Map<String, JTextField> labelFieldMap = new HashMap<>();
private Map<String, JLabel> errorLabelMap = new HashMap<>();
public MyPanel() {
JLabel titleLabel = new JLabel(TITLE, SwingConstants.CENTER);
titleLabel.setForeground(TITLE_COLOR);
titleLabel.setFont(TITLE_FONT);
JPanel titlePanel = new JPanel();
titlePanel.setOpaque(false);
titlePanel.add(titleLabel);
titlePanel.setBorder(BorderFactory.createEtchedBorder());
JPanel labelFieldPanel = new JPanel(new GridBagLayout());
labelFieldPanel.setOpaque(false);
int bGap = 3;
labelFieldPanel.setBorder(BorderFactory.createEmptyBorder(bGap, bGap, bGap, bGap));
for (int i = 0; i < LABELS.length; i++) {
String text = LABELS[i];
JLabel label = new JLabel(text);
JTextField textField = new JTextField(TF_COLS);
JLabel errorLabel = new JLabel(" ");
Border innerBorder = textField.getBorder();
Border outerBorder = BorderFactory.createLineBorder(BACKGROUND);
CompoundBorder myBorder = BorderFactory.createCompoundBorder(outerBorder, innerBorder);
textField.setBorder(myBorder);
label.setFont(LABEL_FONT);
label.setForeground(Color.WHITE);
errorLabel.setFont(ERROR_FONT);
errorLabel.setForeground(Color.RED);
labelFieldMap.put(text, textField);
errorLabelMap.put(text, errorLabel);
GridBagConstraints gbc = createLabelConstraint(i);
labelFieldPanel.add(label, gbc);
gbc = createTextFieldConstraints(i);
labelFieldPanel.add(textField, gbc);
gbc = createErrorLabelConstraints(i);
labelFieldPanel.add(errorLabel, gbc);
// add blank JLabel at the 0 position
gbc.gridx = 0;
labelFieldPanel.add(new JLabel(), gbc);
}
JButton acceptButton = new JButton("Accept");
acceptButton.setMnemonic(KeyEvent.VK_A);
acceptButton.addActionListener(e -> {
boolean okToTransfer = true;
for (int i = 0; i < LABELS.length; i++) {
String text = LABELS[i];
JTextField textField = labelFieldMap.get(text);
JLabel errorLabel = errorLabelMap.get(text);
CompoundBorder myBorder = (CompoundBorder) textField.getBorder();
Border insideBorder = myBorder.getInsideBorder();
if (i < LABELS.length - 1 && textField.getText().trim().isEmpty()) {
errorLabel.setText(ERROR_MESSAGE);
textField.setBackground(ERROR_BG_COLOR);
okToTransfer = false;
Border outsideBorder = BorderFactory.createLineBorder(Color.RED);
CompoundBorder newBorder = BorderFactory.createCompoundBorder(outsideBorder, insideBorder);
textField.setBorder(newBorder);
} else {
errorLabel.setText(" ");
textField.setBackground(Color.WHITE);
Border outsideBorder = BorderFactory.createLineBorder(BACKGROUND);
CompoundBorder newBorder = BorderFactory.createCompoundBorder(outsideBorder, insideBorder);
textField.setBorder(newBorder);
}
System.out.println(text + " " + textField.getText());
}
System.out.println();
if (okToTransfer) {
// TODO: transfer code here
// Window win = SwingUtilities.getWindowAncestor(MyPanel.this);
// win.dispose();
}
});
JButton cancelBtn = new JButton("Cancel");
cancelBtn.setMnemonic(KeyEvent.VK_C);
cancelBtn.addActionListener(e -> {
Window win = SwingUtilities.getWindowAncestor(MyPanel.this);
win.dispose();
});
int btnPanelGap = 15;
JPanel btnPanel = new JPanel(new GridLayout(1, 0, btnPanelGap, 0));
btnPanel.setBorder(BorderFactory.createEmptyBorder(4, btnPanelGap, 4, btnPanelGap));
btnPanel.setOpaque(false);
btnPanel.add(acceptButton);
btnPanel.add(cancelBtn);
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
setBackground(BACKGROUND);
add(titlePanel);
add(labelFieldPanel);
add(btnPanel);
}
private GridBagConstraints createErrorLabelConstraints(int i) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 2 * i + 1;
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(0, 5, 0, 5);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1.0;
gbc.weighty = 0.0;
return gbc;
}
private GridBagConstraints createTextFieldConstraints(int i) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 2 * i;
gbc.anchor = GridBagConstraints.EAST;
gbc.insets = new Insets(5, 0, 0, 5);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1.0;
gbc.weighty = 0.0;
return gbc;
}
private GridBagConstraints createLabelConstraint(int i) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 2 * i;
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(5, 5, 0, 5);
gbc.weightx = 0.0;
gbc.weighty = 0.0;
return gbc;
}
private static void createAndShowGui() {
MyPanel mainPanel = new MyPanel();
JDialog dialog = new JDialog((JFrame) null, "Job Editor", ModalityType.APPLICATION_MODAL);
dialog.getContentPane().add(mainPanel);
dialog.setResizable(false);
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
System.exit(0);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
我已经追查这个错误一段时间了,但似乎无法弄清楚。我有一个带有标签和文本字段列表的小型 GUI。在具有标签 + 文本字段的行之间,有一个包含 JLabel 的空行以根据需要填充错误消息。问题是,当此错误消息出现时,它们上方的文本字段出于某种原因被压缩,并且在尝试不同的东西几个小时后,我似乎无法查明原因。似乎所有 labels/text 区域相互之间也略有压缩。谁能指出问题所在?
我已经尝试在面板网格布局中为每个元素提供更多 space。这似乎并没有改变最终结果。
如果查看代码,元素位于“continuousTransferPanel”上 "singleTransferPanel" 也有同样的问题,只有 2 行。
public void modifyJobWindow()
{
setTitle("Job Editor");
this.setMinimumSize(new Dimension(350, 400));
this.setSize(350, 300);
this.setResizable(false);
JPanel basePanel = new JPanel();
getContentPane().add(basePanel, BorderLayout.CENTER);
basePanel.setLayout(new BorderLayout(0, 0));
JPanel mainPanel = new JPanel();
basePanel.add(mainPanel, BorderLayout.CENTER);
mainPanel.setBackground(new Color(49, 49, 47));
mainPanel.setLayout(new BorderLayout(0, 0));
JPanel optionPanel = new JPanel();
optionPanel.setBackground(new Color(49, 49, 47));
mainPanel.add(optionPanel, BorderLayout.NORTH);
JLabel transferLabel = new JLabel("Transfer Type: ");
transferLabel.setHorizontalAlignment(SwingConstants.LEFT);
transferLabel.setFont(new Font("Arial", Font.BOLD, 16));
transferLabel.setForeground(Color.WHITE);
optionPanel.add(transferLabel);
comboBox = new JComboBox();
comboBox.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if (comboBox.getSelectedItem().equals("Single File Transfer"))
{
acceptButton.setEnabled(true);
continuousTransferPanel.setVisible(false);
deleteSourceCheckBox.setSelected(false);
deleteSourceCheckBox.setEnabled(true);
deleteSourceCheckBox.setForeground(Color.WHITE);
autostartCheckBox.setSelected(false);
autostartCheckBox.setEnabled(false);
autostartCheckBox.setForeground(Color.GRAY);
singleTransferPanel.setVisible(true);
clearErrors();
}
else if (comboBox.getSelectedItem().equals("Continuous File Transfer"))
{
acceptButton.setEnabled(true);
deleteSourceCheckBox.setSelected(false);
deleteSourceCheckBox.setEnabled(true);
deleteSourceCheckBox.setForeground(Color.WHITE);
singleTransferPanel.setVisible(false);
autostartCheckBox.setEnabled(true);
autostartCheckBox.setForeground(Color.WHITE);
continuousTransferPanel.setVisible(true);
clearErrors();
}
else
{
acceptButton.setEnabled(false);
deleteSourceCheckBox.setSelected(false);
deleteSourceCheckBox.setEnabled(false);
deleteSourceCheckBox.setForeground(Color.GRAY);
autostartCheckBox.setSelected(false);
autostartCheckBox.setEnabled(false);
autostartCheckBox.setForeground(Color.GRAY);
singleTransferPanel.setVisible(false);
continuousTransferPanel.setVisible(false);
clearErrors();
}
}
});
comboBox.setModel(new DefaultComboBoxModel(new String[] {"", "Single File Transfer", "Continuous File Transfer"}));
comboBox.setMaximumRowCount(3);
optionPanel.add(comboBox);
JPanel subMainPanel = new JPanel();
subMainPanel.setBackground(new Color(49, 49, 47));
mainPanel.add(subMainPanel, BorderLayout.CENTER);
GridBagLayout gbl_subMainpanel = new GridBagLayout();
gbl_subMainpanel.columnWidths = new int[] {400};
gbl_subMainpanel.rowHeights = new int[] {175};
gbl_subMainpanel.columnWeights = new double[] {1.0};
gbl_subMainpanel.rowWeights = new double[] {0.0, Double.MIN_VALUE};
subMainPanel.setLayout(gbl_subMainpanel);
continuousTransferPanel = new JPanel();
GridBagConstraints gbc_continuousTransferPanel = new GridBagConstraints();
gbc_continuousTransferPanel.anchor = GridBagConstraints.NORTH;
gbc_continuousTransferPanel.fill = GridBagConstraints.HORIZONTAL;
gbc_continuousTransferPanel.gridx = 0;
gbc_continuousTransferPanel.gridy = 0;
subMainPanel.add(continuousTransferPanel, gbc_continuousTransferPanel);
continuousTransferPanel.setBackground(new Color(49, 49, 47));
GridBagLayout gbl_continuousTransferPanel = new GridBagLayout();
gbl_continuousTransferPanel.columnWidths = new int[] {100, 300};
gbl_continuousTransferPanel.rowHeights = new int[] {25, 15, 25, 15, 25, 15, 25, 15};
gbl_continuousTransferPanel.columnWeights = new double[] {0.0, 1.0};
gbl_continuousTransferPanel.rowWeights = new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
continuousTransferPanel.setLayout(gbl_continuousTransferPanel);
continuousTransferPanel.setVisible(false);
JLabel jobCNameLabel = new JLabel("Job Name:");
jobCNameLabel.setFont(new Font("Arial", Font.BOLD, 12));
jobCNameLabel.setForeground(Color.WHITE);
GridBagConstraints gbc_jobCNameLabel = new GridBagConstraints();
gbc_jobCNameLabel.anchor = GridBagConstraints.WEST;
gbc_jobCNameLabel.insets = new Insets(5, 5, 0, 5);
gbc_jobCNameLabel.gridx = 0;
gbc_jobCNameLabel.gridy = 0;
continuousTransferPanel.add(jobCNameLabel, gbc_jobCNameLabel);
JLabel sourceCLabel = new JLabel("Source Folder:");
sourceCLabel.setFont(new Font("Arial", Font.BOLD, 12));
sourceCLabel.setForeground(Color.WHITE);
GridBagConstraints gbc_sourceCLabel = new GridBagConstraints();
gbc_sourceCLabel.anchor = GridBagConstraints.WEST;
gbc_sourceCLabel.insets = new Insets(5, 5, 0, 5);
gbc_sourceCLabel.gridx = 0;
gbc_sourceCLabel.gridy = 2;
continuousTransferPanel.add(sourceCLabel, gbc_sourceCLabel);
JLabel destCLabel = new JLabel("Destination:");
destCLabel.setForeground(Color.WHITE);
destCLabel.setFont(new Font("Arial", Font.BOLD, 12));
GridBagConstraints gbc_destCLabel = new GridBagConstraints();
gbc_destCLabel.insets = new Insets(5, 5, 0, 5);
gbc_destCLabel.anchor = GridBagConstraints.WEST;
gbc_destCLabel.gridx = 0;
gbc_destCLabel.gridy = 4;
continuousTransferPanel.add(destCLabel, gbc_destCLabel);
JLabel fileFilterLabel = new JLabel("File Regex:");
fileFilterLabel.setForeground(Color.WHITE);
fileFilterLabel.setFont(new Font("Arial", Font.BOLD, 12));
GridBagConstraints gbc_fileFilterLabel = new GridBagConstraints();
gbc_fileFilterLabel.insets = new Insets(5, 5, 0, 5);
gbc_fileFilterLabel.anchor = GridBagConstraints.WEST;
gbc_fileFilterLabel.gridx = 0;
gbc_fileFilterLabel.gridy = 6;
continuousTransferPanel.add(fileFilterLabel, gbc_fileFilterLabel);
jobCNameField = new JTextField();
jobCNameField.setBorder(defaultBorder);
GridBagConstraints gbc_jobCNameField = new GridBagConstraints();
gbc_jobCNameField.insets = new Insets(5, 0, 0, 5);
gbc_jobCNameField.fill = GridBagConstraints.HORIZONTAL;
gbc_jobCNameField.gridx = 1;
gbc_jobCNameField.gridy = 0;
continuousTransferPanel.add(jobCNameField, gbc_jobCNameField);
errorFieldCJobName = new JLabel("");
errorFieldCJobName.setFont(new Font("Arial", Font.BOLD, 8));
errorFieldCJobName.setForeground(Color.RED);
GridBagConstraints gbc_errorFieldCJobName = new GridBagConstraints();
gbc_errorFieldCJobName.anchor = GridBagConstraints.WEST;
gbc_errorFieldCJobName.insets = new Insets(0, 5, 0, 5);
gbc_errorFieldCJobName.gridx = 1;
gbc_errorFieldCJobName.gridy = 1;
continuousTransferPanel.add(errorFieldCJobName, gbc_errorFieldCJobName);
sourceCField = new JTextField();
sourceCField.setBorder(defaultBorder);
GridBagConstraints gbc_sourceCField = new GridBagConstraints();
gbc_sourceCField.insets = new Insets(5, 0, 0, 5);
gbc_sourceCField.fill = GridBagConstraints.HORIZONTAL;
gbc_sourceCField.gridx = 1;
gbc_sourceCField.gridy = 2;
continuousTransferPanel.add(sourceCField, gbc_sourceCField);
errorFieldCSourceField = new JLabel("");
errorFieldCSourceField.setFont(new Font("Arial", Font.BOLD, 8));
errorFieldCSourceField.setForeground(Color.RED);
GridBagConstraints gbc_errorFieldCSourceField = new GridBagConstraints();
gbc_errorFieldCSourceField.anchor = GridBagConstraints.WEST;
gbc_errorFieldCSourceField.insets = new Insets(0, 5, 0, 5);
gbc_errorFieldCSourceField.gridx = 1;
gbc_errorFieldCSourceField.gridy = 3;
continuousTransferPanel.add(errorFieldCSourceField, gbc_errorFieldCSourceField);
destCField = new JTextField();
destCField.setBorder(defaultBorder);
GridBagConstraints gbc_destCField = new GridBagConstraints();
gbc_destCField.insets = new Insets(5, 0, 0, 5);
gbc_destCField.fill = GridBagConstraints.HORIZONTAL;
gbc_destCField.gridx = 1;
gbc_destCField.gridy = 4;
continuousTransferPanel.add(destCField, gbc_destCField);
errorFieldCDest = new JLabel("");
errorFieldCDest.setFont(new Font("Arial", Font.BOLD, 8));
errorFieldCDest.setForeground(Color.RED);
GridBagConstraints gbc_errorFieldCDest = new GridBagConstraints();
gbc_errorFieldCDest.anchor = GridBagConstraints.WEST;
gbc_errorFieldCDest.insets = new Insets(0, 5, 0, 5);
gbc_errorFieldCDest.gridx = 1;
gbc_errorFieldCDest.gridy = 5;
continuousTransferPanel.add(errorFieldCDest, gbc_errorFieldCDest);
fileFilterField = new JTextField();
fileFilterField.setBorder(defaultBorder);
GridBagConstraints gbc_fileFilterField = new GridBagConstraints();
gbc_fileFilterField.insets = new Insets(5, 0, 0, 5);
gbc_fileFilterField.fill = GridBagConstraints.HORIZONTAL;
gbc_fileFilterField.gridx = 1;
gbc_fileFilterField.gridy = 6;
continuousTransferPanel.add(fileFilterField, gbc_fileFilterField);
errorFieldFileRegex = new JLabel("");
errorFieldFileRegex.setFont(new Font("Arial", Font.BOLD, 8));
errorFieldFileRegex.setForeground(Color.RED);
GridBagConstraints gbc_errorFieldFileRegex = new GridBagConstraints();
gbc_errorFieldFileRegex.anchor = GridBagConstraints.WEST;
gbc_errorFieldFileRegex.insets = new Insets(0, 5, 0, 5);
gbc_errorFieldFileRegex.gridx = 1;
gbc_errorFieldFileRegex.gridy = 7;
continuousTransferPanel.add(errorFieldFileRegex, gbc_errorFieldFileRegex);
singleTransferPanel = new JPanel();
GridBagConstraints gbc_singleTransferPanel = new GridBagConstraints();
gbc_singleTransferPanel.anchor = GridBagConstraints.NORTH;
gbc_singleTransferPanel.fill = GridBagConstraints.HORIZONTAL;
gbc_singleTransferPanel.gridx = 0;
gbc_singleTransferPanel.gridy = 0;
subMainPanel.add(singleTransferPanel, gbc_singleTransferPanel);
singleTransferPanel.setBackground(new Color(49, 49, 47));
GridBagLayout gbl_singleTransferPanel = new GridBagLayout();
gbl_singleTransferPanel.columnWidths = new int[] {100, 200};
gbl_singleTransferPanel.rowHeights = new int[] {30, 15, 30, 15};
gbl_singleTransferPanel.columnWeights = new double[] {0.0, 1.0};
gbl_singleTransferPanel.rowWeights = new double[] {0.0, 0.0, 0.0, 0.0};
singleTransferPanel.setLayout(gbl_singleTransferPanel);
singleTransferPanel.setVisible(false);
JLabel sourceLabel = new JLabel("Source File:");
sourceLabel.setFont(new Font("Arial", Font.BOLD, 12));
sourceLabel.setForeground(Color.WHITE);
GridBagConstraints gbc_sourceLabel = new GridBagConstraints();
gbc_sourceLabel.anchor = GridBagConstraints.WEST;
gbc_sourceLabel.insets = new Insets(5, 5, 0, 5);
gbc_sourceLabel.gridx = 0;
gbc_sourceLabel.gridy = 0;
singleTransferPanel.add(sourceLabel, gbc_sourceLabel);
JLabel destLabel = new JLabel("Destination:");
destLabel.setForeground(Color.WHITE);
destLabel.setFont(new Font("Arial", Font.BOLD, 12));
GridBagConstraints gbc_destLabel = new GridBagConstraints();
gbc_destLabel.insets = new Insets(5, 5, 0, 5);
gbc_destLabel.anchor = GridBagConstraints.WEST;
gbc_destLabel.gridx = 0;
gbc_destLabel.gridy = 2;
singleTransferPanel.add(destLabel, gbc_destLabel);
sourceField = new JTextField();
sourceField.setBorder(defaultBorder);
GridBagConstraints gbc_sourceField = new GridBagConstraints();
gbc_sourceField.insets = new Insets(5, 0, 0, 5);
gbc_sourceField.fill = GridBagConstraints.HORIZONTAL;
gbc_sourceField.gridx = 1;
gbc_sourceField.gridy = 0;
singleTransferPanel.add(sourceField, gbc_sourceField);
errorFieldSourceField = new JLabel("");
errorFieldSourceField.setFont(new Font("Arial", Font.BOLD, 8));
errorFieldSourceField.setForeground(Color.RED);
GridBagConstraints gbc_errorFieldSourceField = new GridBagConstraints();
gbc_errorFieldSourceField.anchor = GridBagConstraints.WEST;
gbc_errorFieldSourceField.insets = new Insets(0, 5, 0, 5);
gbc_errorFieldSourceField.gridx = 1;
gbc_errorFieldSourceField.gridy = 1;
singleTransferPanel.add(errorFieldSourceField, gbc_errorFieldSourceField);
destField = new JTextField();
destField.setBorder(defaultBorder);
GridBagConstraints gbc_destField = new GridBagConstraints();
gbc_destField.insets = new Insets(5, 0, 0, 5);
gbc_destField.fill = GridBagConstraints.HORIZONTAL;
gbc_destField.gridx = 1;
gbc_destField.gridy = 2;
singleTransferPanel.add(destField, gbc_destField);
errorFieldDest = new JLabel("");
errorFieldDest.setFont(new Font("Arial", Font.BOLD, 8));
errorFieldDest.setForeground(Color.RED);
GridBagConstraints gbc_errorFieldDest = new GridBagConstraints();
gbc_errorFieldDest.anchor = GridBagConstraints.WEST;
gbc_errorFieldDest.insets = new Insets(0, 5, 0, 5);
gbc_errorFieldDest.gridx = 1;
gbc_errorFieldDest.gridy = 3;
singleTransferPanel.add(errorFieldDest, gbc_errorFieldDest);
JPanel titlePanel = new JPanel();
basePanel.add(titlePanel, BorderLayout.NORTH);
titlePanel.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
titlePanel.setBackground(new Color(49, 49, 47));
titlePanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
JLabel titleLabel = new JLabel("File Transfer Job Editor");
titleLabel.setForeground(new Color(243, 112, 33));
titleLabel.setFont(new Font("Arial", Font.BOLD, 28));
titlePanel.add(titleLabel);
JPanel buttonPanel = new JPanel();
basePanel.add(buttonPanel, BorderLayout.SOUTH);
buttonPanel.setBorder(new BevelBorder(BevelBorder.RAISED, null, null, null, null));
GridBagLayout gbl_buttonPanel = new GridBagLayout();
gbl_buttonPanel.columnWidths = new int[] {175, 175, 0};
gbl_buttonPanel.rowHeights = new int[] {30, 30, 0};
gbl_buttonPanel.columnWeights = new double[] {1.0, 1.0, Double.MIN_VALUE};
gbl_buttonPanel.rowWeights = new double[] {0.0, 0.0, Double.MIN_VALUE};
buttonPanel.setBackground(new Color(49, 49, 47));
buttonPanel.setLayout(gbl_buttonPanel);
autostartCheckBox = new JCheckBox("Auto Start");
autostartCheckBox.setForeground(Color.gray);
autostartCheckBox.setEnabled(false);
autostartCheckBox.setHorizontalAlignment(SwingConstants.CENTER);
autostartCheckBox.setFont(new Font("Calibri", Font.BOLD, 16));
autostartCheckBox.setBackground(new Color(49, 49, 47));
GridBagConstraints gbc_autostartCheckBox = new GridBagConstraints();
gbc_autostartCheckBox.gridwidth = 1;
gbc_autostartCheckBox.fill = GridBagConstraints.VERTICAL;
gbc_autostartCheckBox.insets = new Insets(0, 0, 5, 5);
gbc_autostartCheckBox.gridx = 0;
gbc_autostartCheckBox.gridy = 0;
buttonPanel.add(autostartCheckBox, gbc_autostartCheckBox);
deleteSourceCheckBox = new JCheckBox("Delete Source File");
deleteSourceCheckBox.setHorizontalAlignment(SwingConstants.CENTER);
deleteSourceCheckBox.setForeground(Color.WHITE);
deleteSourceCheckBox.setEnabled(false);
deleteSourceCheckBox.setForeground(Color.gray);
deleteSourceCheckBox.setFont(new Font("Calibri", Font.BOLD, 16));
deleteSourceCheckBox.setBackground(new Color(49, 49, 47));
GridBagConstraints gbc_deleteSourceCheckBox = new GridBagConstraints();
gbc_deleteSourceCheckBox.gridwidth = 1;
gbc_deleteSourceCheckBox.fill = GridBagConstraints.VERTICAL;
gbc_deleteSourceCheckBox.insets = new Insets(0, 0, 5, 5);
gbc_deleteSourceCheckBox.gridx = 1;
gbc_deleteSourceCheckBox.gridy = 0;
buttonPanel.add(deleteSourceCheckBox, gbc_deleteSourceCheckBox);
JButton cancelButton = new JButton("Cancel");
cancelButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
close();
}
});
cancelButton.setFont(new Font("Calibri", Font.BOLD, 14));
cancelButton.setPreferredSize(new Dimension(100, 30));
GridBagConstraints gbc_generateButton = new GridBagConstraints();
gbc_generateButton.insets = new Insets(0, 0, 10, 0);
gbc_generateButton.gridx = 0;
gbc_generateButton.gridy = 1;
buttonPanel.add(cancelButton, gbc_generateButton);
acceptButton = new JButton("Accept");
acceptButton.setEnabled(false);
acceptButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent arg0)
{
success = true;
if (comboBox.getSelectedItem().equals("Single File Transfer"))
{
if (sourceField.getText().length() > 0)
{
File sourceCheck = new File(sourceField.getText());
if (sourceCheck.exists() && sourceCheck.isFile())
{
// Success
sourceField.setBorder(defaultBorder);
errorFieldSourceField.setText("");
}
else
{
sourceField.setBorder(BorderFactory.createLineBorder(Color.red));
errorFieldSourceField.setText("File does not exist.");
success = false;
}
}
else
{
sourceField.setBorder(BorderFactory.createLineBorder(Color.red));
errorFieldSourceField.setText("Cannot be empty.");
success = false;
}
if (destField.getText().length() > 0)
{
destField.setBorder(defaultBorder);
errorFieldDest.setText("");
}
else
{
destField.setBorder(BorderFactory.createLineBorder(Color.red));
errorFieldDest.setText("Cannot be empty.");
success = false;
}
if (success == true)
{
Job newJob = new Job("SingleJob", sourceField.getText(), destField.getText(), null, deleteSourceCheckBox.isSelected(), true);
// TODO: Start Job
}
}
else if (comboBox.getSelectedItem().equals("Continuous File Transfer"))
{
success = true;
if (jobCNameField.getText().length() > 0)
{
File jobNameCheck = new File("jobs/" + jobCNameField.getText() + ".job");
if (jobNameCheck.exists() && modify == false)
{
jobCNameField.setBorder(BorderFactory.createLineBorder(Color.red));
errorFieldCJobName.setText("Job name already exists.");
success = false;
}
else
{
// Success
jobCNameField.setBorder(defaultBorder);
errorFieldCJobName.setText("");
}
}
else
{
jobCNameField.setBorder(BorderFactory.createLineBorder(Color.red));
errorFieldCJobName.setText("Cannot be empty.");
success = false;
}
if (sourceCField.getText().length() > 0)
{
File sourceCheck = new File(sourceCField.getText());
if (sourceCheck.exists() && sourceCheck.isDirectory())
{
// Success
sourceCField.setBorder(defaultBorder);
errorFieldCSourceField.setText("");
}
else
{
sourceCField.setBorder(BorderFactory.createLineBorder(Color.red));
errorFieldCSourceField.setText("Directory does not exist.");
success = false;
}
}
else
{
sourceCField.setBorder(BorderFactory.createLineBorder(Color.red));
errorFieldCSourceField.setText("Cannot be empty.");
success = false;
}
if (destCField.getText().length() > 0)
{
destCField.setBorder(defaultBorder);
errorFieldCDest.setText("");
}
else
{
destCField.setBorder(BorderFactory.createLineBorder(Color.red));
errorFieldCDest.setText("Cannot be empty.");
success = false;
}
try
{
Pattern.compile(fileFilterField.getText());
errorFieldFileRegex.setText("");
fileFilterField.setBorder(defaultBorder);
}
catch (PatternSyntaxException exception)
{
fileFilterField.setBorder(BorderFactory.createLineBorder(Color.red));
errorFieldFileRegex.setText("Invalid syntax.");
success = false;
}
if (success == true)
{
if (modify)
{
FileTransferUtility.jobList.remove(originalJob);
FileTransferGUI.clearJobFromTable(originalJob);
// TODO: Stop if running
}
if (comboBox.getSelectedItem().equals("Continuous File Transfer"))
{
Job newJob = new Job(jobCNameField.getText(), sourceCField.getText(), destCField.getText(), fileFilterField.getText(), deleteSourceCheckBox.isSelected(),
autostartCheckBox.isSelected());
JobHandler newJobHandler = new JobHandler(newJob);
FileTransferUtility.jobList.add(newJobHandler);
newJob.writeToFile("/jobs");
FileTransferGUI.addJobToTable(newJobHandler);
if (autostartCheckBox.isSelected())
{
// TODO: Start Job
}
}
close();
}
}
}
});
acceptButton.setPreferredSize(new Dimension(100, 30));
acceptButton.setFont(new Font("Calibri", Font.BOLD, 14));
GridBagConstraints gbc_closeButton = new GridBagConstraints();
gbc_closeButton.insets = new Insets(0, 0, 10, 0);
gbc_closeButton.gridx = 1;
gbc_closeButton.gridy = 1;
buttonPanel.add(acceptButton, gbc_closeButton);
JPanel entryPanel = new JPanel();
entryPanel.setBorder(null);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.pack();
this.setVisible(true);
}
不是真正的答案,但我无法通过 MCVE 尝试重现您的问题。注意使用数组和集合(这里是映射)来简化代码:
import java.awt.*;
import java.awt.event.*;
import java.util.HashMap;
import java.util.Map;
import javax.swing.*;
@SuppressWarnings("serial")
public class MyPanel extends JPanel {
public static final String[] LABELS = {"Job Name:", "Source Folder:", "Destination:", "File Regex:"};
private static final int TF_COLS = 20;
private static final Font LABEL_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 12);
private static final Font ERROR_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 8);
private static final String ERROR_MESSAGE = "Cannot Be Empty";
private static final Color BACKGROUND = new Color(49, 49, 47);
private Map<String, JTextField> labelFieldMap = new HashMap<>();
private Map<String, JLabel> errorLabelMap = new HashMap<>();
public MyPanel() {
setLayout(new BorderLayout());
setBackground(BACKGROUND);
JPanel labelFieldPanel = new JPanel(new GridBagLayout());
labelFieldPanel.setOpaque(false);
for (int i = 0; i < LABELS.length; i++) {
String text = LABELS[i];
JLabel label = new JLabel(text);
JTextField textField = new JTextField(TF_COLS);
JLabel errorLabel = new JLabel(" ");
label.setFont(LABEL_FONT);
label.setForeground(Color.WHITE);
errorLabel.setFont(ERROR_FONT);
errorLabel.setForeground(Color.RED);
labelFieldMap.put(text, textField);
errorLabelMap.put(text, errorLabel);
GridBagConstraints gbc = createLabelConstraint(i);
labelFieldPanel.add(label, gbc);
gbc = createTextFieldConstraints(i);
labelFieldPanel.add(textField, gbc);
gbc = createErrorLabelConstraints(i);
labelFieldPanel.add(errorLabel, gbc);
// add blank JLabel at the 0 position
gbc.gridx = 0;
labelFieldPanel.add(new JLabel(), gbc);
}
JButton acceptButton = new JButton("Accept");
acceptButton.setMnemonic(KeyEvent.VK_A);
acceptButton.addActionListener(e -> {
for (int i = 0; i < LABELS.length - 1; i++) {
String text = LABELS[i];
JTextField textField = labelFieldMap.get(text);
JLabel errorLabel = errorLabelMap.get(text);
if (textField.getText().trim().isEmpty()) {
errorLabel.setText(ERROR_MESSAGE);
} else {
errorLabel.setText(" ");
System.out.println(text + " " + textField.getText());
}
}
System.out.println();
});
JPanel btnPanel = new JPanel();
btnPanel.setOpaque(false);
btnPanel.add(acceptButton);
add(labelFieldPanel, BorderLayout.CENTER);
add(btnPanel, BorderLayout.PAGE_END);
}
private GridBagConstraints createErrorLabelConstraints(int i) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 2 * i + 1;
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(0, 5, 0, 5);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1.0;
gbc.weighty = 0.0;
return gbc;
}
private GridBagConstraints createTextFieldConstraints(int i) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 2 * i;
gbc.anchor = GridBagConstraints.EAST;
gbc.insets = new Insets(5, 0, 0, 5);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1.0;
gbc.weighty = 0.0;
return gbc;
}
private GridBagConstraints createLabelConstraint(int i) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 2 * i;
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(5, 5, 0, 5);
gbc.weightx = 0.0;
gbc.weighty = 0.0;
return gbc;
}
private static void createAndShowGui() {
MyPanel mainPanel = new MyPanel();
JFrame frame = new JFrame("MyPanel");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
生成的 GUI:
由于问题出在您的 JTextField 的边框上,并且由于您无法在没有 运行 的情况下完全重置默认边框,因此一种解决方案是为您的 JTextField 创建一个 CompoundBorder,外边框为 LineBorder它使用与 JPanel 的背景颜色相同的颜色,内部边框是 JTextField 的默认边框。然后在你的动作侦听器中,简单地创建一个新的复合边框,一个使用 Color.RED 外边框的边框。
所以在下面的示例中创建我的 JTextFields 时,我还创建了一个 CompoundBorder,给它一个 outerBorder 和 innerBorder,如下所示:
// create JTextField with TF_COLS int column count value
JTextField textField = new JTextField(TF_COLS);
// get the JTextField's default border and make it our inner border
Border innerBorder = textField.getBorder();
// create an outer LineBorder that uses the JPanel's background color
Border outerBorder = BorderFactory.createLineBorder(BACKGROUND);
// create the compound border with these two borders
CompoundBorder myBorder = BorderFactory.createCompoundBorder(outerBorder, innerBorder);
// and set the JTextField's border with it
textField.setBorder(myBorder);
然后在 JButton 的 ActionListener 中,获取 JTextField 的当前边框,我们的复合边框,并更改外边框的线条颜色。简单:
// loop through all the JLabel texts
for (int i = 0; i < LABELS.length; i++) {
String text = LABELS[i]; // get the array item
// use it to get the JTextField associated with this String
JTextField textField = labelFieldMap.get(text);
// same for the error JLabel
JLabel errorLabel = errorLabelMap.get(text);
// get our current JTextField's border which is a compound border
CompoundBorder myBorder = (CompoundBorder) textField.getBorder();
// the insideBorder, the original JTextField's border, will be unchanged
Border insideBorder = myBorder.getInsideBorder();
// if the text field is empty (and not the last jtext field)
if (i < LABELS.length - 1 && textField.getText().trim().isEmpty()) {
errorLabel.setText(ERROR_MESSAGE); // set the error JLabel
// set txt field's color if we want
textField.setBackground(ERROR_BG_COLOR);
// okToTransfer = false;
// create a compound border, the outer border now a line border, RED
Border outsideBorder = BorderFactory.createLineBorder(Color.RED);
CompoundBorder newBorder = BorderFactory.createCompoundBorder(outsideBorder, insideBorder);
// set the JTextField's border to this one
textField.setBorder(newBorder);
} else {
// else all OK
errorLabel.setText(" ");
textField.setBackground(Color.WHITE);
// set the JTextField's border back to our original compound border
Border outsideBorder = BorderFactory.createLineBorder(BACKGROUND);
CompoundBorder newBorder = BorderFactory.createCompoundBorder(outsideBorder,
insideBorder);
textField.setBorder(newBorder);
}
System.out.println(text + " " + textField.getText());
}
例如:
import java.awt.*;
import java.awt.Dialog.ModalityType;
import java.awt.event.*;
import java.util.HashMap;
import java.util.Map;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
@SuppressWarnings("serial")
public class MyPanel extends JPanel {
public static final String[] LABELS = { "Job Name:", "Source Folder:", "Destination:",
"File Regex:" };
private static final int TF_COLS = 30;
private static final Font LABEL_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 12);
private static final Font ERROR_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 8);
private static final String ERROR_MESSAGE = "Cannot Be Empty";
private static final Color BACKGROUND = new Color(49, 49, 47);
private static final String TITLE = "File Transfer Job Editor";
private static final Color TITLE_COLOR = new Color(243, 112, 33);
private static final Font TITLE_FONT = new Font("Arial", Font.BOLD, 28);
private static final Color ERROR_BG_COLOR = new Color(255, 220, 220);
private Map<String, JTextField> labelFieldMap = new HashMap<>();
private Map<String, JLabel> errorLabelMap = new HashMap<>();
public MyPanel() {
JLabel titleLabel = new JLabel(TITLE, SwingConstants.CENTER);
titleLabel.setForeground(TITLE_COLOR);
titleLabel.setFont(TITLE_FONT);
JPanel titlePanel = new JPanel();
titlePanel.setOpaque(false);
titlePanel.add(titleLabel);
titlePanel.setBorder(BorderFactory.createEtchedBorder());
JPanel labelFieldPanel = new JPanel(new GridBagLayout());
labelFieldPanel.setOpaque(false);
int bGap = 3;
labelFieldPanel.setBorder(BorderFactory.createEmptyBorder(bGap, bGap, bGap, bGap));
for (int i = 0; i < LABELS.length; i++) {
String text = LABELS[i];
JLabel label = new JLabel(text);
JTextField textField = new JTextField(TF_COLS);
JLabel errorLabel = new JLabel(" ");
Border innerBorder = textField.getBorder();
Border outerBorder = BorderFactory.createLineBorder(BACKGROUND);
CompoundBorder myBorder = BorderFactory.createCompoundBorder(outerBorder, innerBorder);
textField.setBorder(myBorder);
label.setFont(LABEL_FONT);
label.setForeground(Color.WHITE);
errorLabel.setFont(ERROR_FONT);
errorLabel.setForeground(Color.RED);
labelFieldMap.put(text, textField);
errorLabelMap.put(text, errorLabel);
GridBagConstraints gbc = createLabelConstraint(i);
labelFieldPanel.add(label, gbc);
gbc = createTextFieldConstraints(i);
labelFieldPanel.add(textField, gbc);
gbc = createErrorLabelConstraints(i);
labelFieldPanel.add(errorLabel, gbc);
// add blank JLabel at the 0 position
gbc.gridx = 0;
labelFieldPanel.add(new JLabel(), gbc);
}
JButton acceptButton = new JButton("Accept");
acceptButton.setMnemonic(KeyEvent.VK_A);
acceptButton.addActionListener(e -> {
boolean okToTransfer = true;
for (int i = 0; i < LABELS.length; i++) {
String text = LABELS[i];
JTextField textField = labelFieldMap.get(text);
JLabel errorLabel = errorLabelMap.get(text);
CompoundBorder myBorder = (CompoundBorder) textField.getBorder();
Border insideBorder = myBorder.getInsideBorder();
if (i < LABELS.length - 1 && textField.getText().trim().isEmpty()) {
errorLabel.setText(ERROR_MESSAGE);
textField.setBackground(ERROR_BG_COLOR);
okToTransfer = false;
Border outsideBorder = BorderFactory.createLineBorder(Color.RED);
CompoundBorder newBorder = BorderFactory.createCompoundBorder(outsideBorder, insideBorder);
textField.setBorder(newBorder);
} else {
errorLabel.setText(" ");
textField.setBackground(Color.WHITE);
Border outsideBorder = BorderFactory.createLineBorder(BACKGROUND);
CompoundBorder newBorder = BorderFactory.createCompoundBorder(outsideBorder, insideBorder);
textField.setBorder(newBorder);
}
System.out.println(text + " " + textField.getText());
}
System.out.println();
if (okToTransfer) {
// TODO: transfer code here
// Window win = SwingUtilities.getWindowAncestor(MyPanel.this);
// win.dispose();
}
});
JButton cancelBtn = new JButton("Cancel");
cancelBtn.setMnemonic(KeyEvent.VK_C);
cancelBtn.addActionListener(e -> {
Window win = SwingUtilities.getWindowAncestor(MyPanel.this);
win.dispose();
});
int btnPanelGap = 15;
JPanel btnPanel = new JPanel(new GridLayout(1, 0, btnPanelGap, 0));
btnPanel.setBorder(BorderFactory.createEmptyBorder(4, btnPanelGap, 4, btnPanelGap));
btnPanel.setOpaque(false);
btnPanel.add(acceptButton);
btnPanel.add(cancelBtn);
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
setBackground(BACKGROUND);
add(titlePanel);
add(labelFieldPanel);
add(btnPanel);
}
private GridBagConstraints createErrorLabelConstraints(int i) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 2 * i + 1;
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(0, 5, 0, 5);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1.0;
gbc.weighty = 0.0;
return gbc;
}
private GridBagConstraints createTextFieldConstraints(int i) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 2 * i;
gbc.anchor = GridBagConstraints.EAST;
gbc.insets = new Insets(5, 0, 0, 5);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1.0;
gbc.weighty = 0.0;
return gbc;
}
private GridBagConstraints createLabelConstraint(int i) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 2 * i;
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(5, 5, 0, 5);
gbc.weightx = 0.0;
gbc.weighty = 0.0;
return gbc;
}
private static void createAndShowGui() {
MyPanel mainPanel = new MyPanel();
JDialog dialog = new JDialog((JFrame) null, "Job Editor", ModalityType.APPLICATION_MODAL);
dialog.getContentPane().add(mainPanel);
dialog.setResizable(false);
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
System.exit(0);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}