当向 JTextArea 中输入大量文本时,JTextFields 和 JTextArea 会缩小
JTextFields and JTextArea shrinking when inputting large quantity of text into JTextArea
我在 JDialog
框中有一个 JTabbedPane
,它在窗格中包含的所有 JPanels
上使用 GridBagLayout
。在显示的第一个面板上有一个 JTextArea
(descTxt
) 可以输入电影描述。当您在 JTextArea
中输入大量文本时,它似乎很好,直到您单击面板上不是组件的任意位置(空灰色 space),然后所有文本字段和文本窗格都缩小到看起来像 0 的大小。
这里有一些要粘贴和测试的示例文本:
During a manned mission to Mars, Astronaut Mark Watney is presumed
dead after a fierce storm and left behind by his crew. But Watney has
survived and finds himself stranded and alone on the hostile planet.
With only meager supplies, he must draw upon his ingenuity, wit and
spirit to subsist and find a way to signal to Earth that he is alive.
这是我的代码的可运行示例:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.regex.Pattern;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.filechooser.FileNameExtensionFilter;
/**
*
* @author Chris
*/
public class AdminWindow extends JDialog implements ActionListener {
private JPanel adminPanel1, adminPanel2, adminPanel3;
private JTabbedPane tabPane;
private GridBagConstraints g1, g2, g3;
private JLabel idLbl, showLbl, descLbl, ageLbl, imgLbl, timeLbl, screenLbl,
stanLbl, vipLbl, idLbl1, showLbl1, descLbl1, ageLbl1, imgLbl1, imgName;
private JTextField idTxt, showTxt, imgTxt, timeTxt, stanTxt, vipTxt,
idTxt1, showTxt1, imgTxt1;
private JTextArea descTxt, descTxt1;
private JComboBox ageCb, ageCb1, screenCb, timeCb, showingCb;
private JScrollPane descTxtPane, descTxtPane1;
private ArrayList<String> screenList, timeList, showingList;
private DefaultComboBoxModel screenModel, timeModel, showingModel;
private JButton submit, clear, seatSubmit, seatClear, addBtn, subBtn,
submit1, clear1, imgBtn;
private double stanPrice, vipPrice;
private String stanPriceString, vipPriceString, priceExpression, imgString;
private Pattern p;
private File dest, chosenFile;
public AdminWindow() {
//frame properties
super(new JFrame("Admin Panel"));
setTitle("Admin Panel");
//setSize(Dimensions.getScreenWidth() - 100, Dimensions.getScreenHeight() - 100);
setAlwaysOnTop(true);
setResizable(false);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setLocationRelativeTo(null);
//regular expression validations
priceExpression = "[0-9]{1,2}[.]{1}[0-9]{2}";
p = Pattern.compile(priceExpression);
//panel dec
tabPane = new JTabbedPane();
adminPanel1 = new JPanel();
adminPanel2 = new JPanel();
adminPanel3 = new JPanel();
g1 = new GridBagConstraints();
g2 = new GridBagConstraints();
g3 = new GridBagConstraints();
//label dec
idLbl = new JLabel("Film ID");
showLbl = new JLabel("Film Name");
descLbl = new JLabel("Film Description");
ageLbl = new JLabel("Age Rating");
imgLbl = new JLabel("Image");
idLbl1 = new JLabel("Film ID");
showLbl1 = new JLabel("Film Name");
descLbl1 = new JLabel("Film Description");
ageLbl1 = new JLabel("Age Rating");
imgLbl1 = new JLabel("Image");
timeLbl = new JLabel("Showing Times");
screenLbl = new JLabel("Screen Number");
stanLbl = new JLabel("Standard Ticket Cost (£)");
vipLbl = new JLabel("VIP Ticket Cost (£)");
imgName = new JLabel("filename.jpg");
//label properties
imgName.setPreferredSize(new Dimension(100, 20));
//txttfield dec
idTxt = new JTextField(4);
showTxt = new JTextField(30);
descTxt = new JTextArea(4, 30);
descTxtPane = new JScrollPane(descTxt, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
imgTxt = new JTextField();
idTxt1 = new JTextField(4);
showTxt1 = new JTextField(30);
descTxt1 = new JTextArea(4, 30);
descTxtPane1 = new JScrollPane(descTxt1, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
imgTxt1 = new JTextField();
timeTxt = new JTextField(4);
stanTxt = new JTextField(4);
vipTxt = new JTextField(4);
//textfield properties
idTxt1.setEditable(false);
descTxt.setWrapStyleWord(true);
descTxt.setLineWrap(true);
//drop-down dec
ageCb = new JComboBox();
ageCb1 = new JComboBox();
screenCb = new JComboBox();
timeCb = new JComboBox();
showingCb = new JComboBox();
//dropdown properties
timeCb.setPreferredSize(new Dimension(60, 23));
//buttons
submit = new JButton("Submit");
clear = new JButton("Clear");
submit1 = new JButton("Submit");
clear1 = new JButton("Clear");
seatSubmit = new JButton("Submit");
seatClear = new JButton("Show Current");
addBtn = new JButton("+");
subBtn = new JButton("-");
imgBtn = new JButton("Browse..");
//button properties
addBtn.setFocusPainted(false);
subBtn.setFocusPainted(false);
addBtn.setMargin(new Insets(0, 5, 0, 5));
subBtn.setMargin(new Insets(0, 5, 0, 5));
//listeners
submit.addActionListener(this);
clear.addActionListener(this);
seatSubmit.addActionListener(this);
seatClear.addActionListener(this);
addBtn.addActionListener(this);
subBtn.addActionListener(this);
imgBtn.addActionListener(this);
//fill price text fields with existing prices
defaultForm();
//add items to jcombobox
ageCb.addItem("U");
ageCb.addItem("12A");
ageCb.addItem("15");
ageCb.addItem("18");
ageCb1.addItem("U");
ageCb1.addItem("12A");
ageCb1.addItem("15");
ageCb1.addItem("18");
//panel properties
adminPanel1.setLayout(new GridBagLayout());
adminPanel2.setLayout(new GridBagLayout());
adminPanel3.setLayout(new GridBagLayout());
adminPanel1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "New Showing"));
adminPanel2.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "Seat Prices"));
adminPanel3.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "Edit Showing"));
//ading panels to tabbed pane
tabPane.addTab("Add Showings", null, adminPanel1, "Add new showings & showing times");
tabPane.addTab("Seat Prices", null, adminPanel2, "Change seat prices");
tabPane.addTab("Edit Showing", null, adminPanel3, "Edit existing showing");
//-----adding components to pane--------------------------------------!
g1.gridx = 0;
g1.gridy = 0;
g1.insets = new Insets(10, 0, 0, 10);
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(idLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
adminPanel1.add(idTxt, g1);
g1.gridy++;
g1.gridx--;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(showLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
g1.gridwidth = 4;
adminPanel1.add(showTxt, g1);
g1.gridwidth = 1;
g1.gridy++;
g1.gridx--;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(descLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
g1.gridwidth = 4;
adminPanel1.add(descTxtPane, g1);
g1.gridwidth = 1;
g1.gridy++;
g1.gridx--;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(ageLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
adminPanel1.add(ageCb, g1);
g1.gridy++;
g1.gridx--;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(imgLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
g1.gridwidth = 2;
adminPanel1.add(imgBtn, g1);
g1.gridx = 3;
adminPanel1.add(imgName, g1);
g1.gridwidth = 1;
g1.gridy++;
g1.gridx = 0;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(screenLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
adminPanel1.add(screenCb, g1);
g1.gridx--;
g1.gridy++;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(timeLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
adminPanel1.add(timeTxt, g1);
g1.gridx++;
adminPanel1.add(addBtn, g1);
g1.gridx++;
adminPanel1.add(timeCb, g1);
g1.gridx++;
adminPanel1.add(subBtn, g1);
//buttons
g1.gridy++;
g1.gridx = 0;
g1.insets = new Insets(10, 0, 10, 10); //top, right, bottom, left
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(clear, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
g1.gridwidth = 4;
adminPanel1.add(submit, g1);
g1.gridwidth = 1;
//------adding components to panel2-----------------------------------!
//left
g2.gridx = 0;
g2.gridy = 0;
g2.insets = new Insets(10, 10, 0, 10);
g2.anchor = GridBagConstraints.LINE_END;
adminPanel2.add(stanLbl, g2);
g2.gridy++;
adminPanel2.add(vipLbl, g2);
g2.gridy++;
adminPanel2.add(seatClear, g2);
//right
g2.gridy = 0;
g2.gridx++;
g2.anchor = GridBagConstraints.LINE_START;
adminPanel2.add(stanTxt, g2);
g2.gridy++;
adminPanel2.add(vipTxt, g2);
g2.gridy++;
adminPanel2.add(seatSubmit, g2);
//-----adminpanel3-----------------------------------------------------
//adding components to panel1
g3.gridx = 1;
g3.gridy = 0;
g3.insets = new Insets(10, 0, 0, 10);
g3.anchor = GridBagConstraints.LINE_START;
g3.gridwidth = 4;
adminPanel3.add(showingCb, g3);
g3.gridwidth = 1;
g3.gridx--;
g3.gridy++;
g3.anchor = GridBagConstraints.LINE_END;
adminPanel3.add(idLbl1, g3);
g3.gridx++;
g3.anchor = GridBagConstraints.LINE_START;
adminPanel3.add(idTxt1, g3);
g3.gridy++;
g3.gridx--;
g3.anchor = GridBagConstraints.LINE_END;
adminPanel3.add(showLbl1, g3);
g3.gridx++;
g3.anchor = GridBagConstraints.LINE_START;
g3.gridwidth = 5;
adminPanel3.add(showTxt1, g3);
g3.gridwidth = 1;
g3.gridy++;
g3.gridx--;
g3.anchor = GridBagConstraints.LINE_END;
adminPanel3.add(descLbl1, g3);
g3.gridx++;
g3.anchor = GridBagConstraints.LINE_START;
g3.gridwidth = 4;
adminPanel3.add(descTxtPane1, g3);
g3.gridwidth = 1;
g3.gridy++;
g3.gridx--;
g3.anchor = GridBagConstraints.LINE_END;
adminPanel3.add(ageLbl1, g3);
g3.gridx++;
g3.anchor = GridBagConstraints.LINE_START;
adminPanel3.add(ageCb1, g3);
g3.gridy++;
g3.gridx--;
//buttons
g3.gridy++;
g3.gridx = 0;
g3.insets = new Insets(10, 0, 10, 10); //top, right, bottom, left
g3.anchor = GridBagConstraints.LINE_END;
adminPanel3.add(clear1, g3);
g3.gridx++;
g3.anchor = GridBagConstraints.LINE_START;
g3.gridwidth = 4;
adminPanel3.add(submit1, g3);
g3.gridwidth = 1;
//adding tabbed pane to frame
this.add(tabPane);
this.pack();
//visibility
setVisible(true);
tabPane.setVisible(true);
//actionlisteners
}
public static void main(String[] args) {
AdminWindow test = new AdminWindow();
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == imgBtn) {
//--JFileChooser, ugly but better to use--
String userDir = System.getProperty("user.home");
JFileChooser chooser = new JFileChooser(userDir+"/Desktop");
int choice = chooser.showDialog(this, "Choose");
if (choice != JFileChooser.APPROVE_OPTION) {
return;
}
FileNameExtensionFilter filter = new FileNameExtensionFilter("Image Files", "jpg", "png", "gif", "jpeg");
chooser.setAcceptAllFileFilterUsed(false);
chooser.addChoosableFileFilter(filter);
chosenFile = chooser.getSelectedFile();
imgName.setText(chosenFile.getName());
dest = new File(System.getProperty("user.dir") + "/src/iegroup/resources", chosenFile.getName());
imgString = "resources/" + chosenFile.getName();
System.out.println(dest.toPath());
}
if (e.getSource() == submit) {
if (e.getSource() == clear ){
}
if (e.getSource() == seatSubmit) {
}
}
if (e.getSource() == seatClear) {
defaultForm();
}
if (e.getSource() == addBtn) {
timeModel.addElement(timeTxt.getText());
timeList.add(timeTxt.getText());
}
if (e.getSource() == subBtn) {
timeModel.removeElement(timeCb.getSelectedItem());
timeList.remove(timeCb.getSelectedItem());
}
}
private void defaultForm() {
stanPriceString = String.format("%.2f", stanPrice);
vipPriceString = String.format("%.2f", vipPrice);
stanTxt.setText(stanPriceString);
vipTxt.setText(vipPriceString);
}
public void showValidationPrompt(String message) {
JFrame validFrame = new JFrame();
validFrame.setAlwaysOnTop(true);
JOptionPane.showMessageDialog(validFrame, message, "Invalid input", JOptionPane.CLOSED_OPTION);
}
public void showSuccessPrompt(String message) {
JFrame errorFrame = new JFrame();
errorFrame.setAlwaysOnTop(true);
JOptionPane.showMessageDialog(errorFrame, message, "Success", JOptionPane.CLOSED_OPTION);
}
}
请帮忙。这个非常令人困惑,我似乎无法在任何地方找到解决方案。
所以,问题似乎是 setResizable(false)
和 ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED
的组合(好吧,我只是讨厌不可调整大小 windows)。
发生的事情是,当您填充 JTextArea
时,"adding" 和 JScrollPane
变成了 "packed" window,所以组件的大小有改变了,那么当容器重新生效时,不再有足够的 space 剩余来将所有字段打包成它们的首选大小,所以它们被调整到它们的最小大小,通常是 0x0
或足够接近。
您可以做一些事情来帮助事情顺利进行。您可以对文本字段使用 GridBagConstraints#fill
并使用 GridBagConstraints.HORIZONTAL
,对文本区域使用 GridBagConstraints.BOTH
,这将允许字段 "fill" 并占用可用的 [= column/row 的 58=],无论何时单元格 space 小于组件的首选大小。
您可能还会发现 GridBagConstraints#weightx/y
到 1
可以提供帮助。
如果您遇到了真正的麻烦,您可以简单地在 JScrollPane
中使用 ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS
,虽然不漂亮,但会在 [=] 中添加 JScrollBar
大小16=] 当 window 被打包时
已更新
所以,基本上,我最终将 fill
和 weightx/y
组合用于 JScrollPane
和 JTextArea
s
g1.fill = GridBagConstraints.BOTH;
g1.weightx = 1;
g1.weighty = 1;
adminPanel1.add(descTxtPane, g1);
g1.fill = GridBagConstraints.NONE;
g1.weightx = 0;
g1.weighty = 0;
对于 JTextField
s 我刚刚使用了 fill
似乎已经稳定了事情...
g1.fill = GridBagConstraints.HORIZONTAL;
adminPanel1.add(idTxt, g1);
g1.fill = GridBagConstraints.NONE;
这导致了类似...
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.regex.Pattern;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.filechooser.FileNameExtensionFilter;
public class AdminWindow extends JDialog implements ActionListener {
private JPanel adminPanel1, adminPanel2, adminPanel3;
private JTabbedPane tabPane;
private GridBagConstraints g1, g2, g3;
private JLabel idLbl, showLbl, descLbl, ageLbl, imgLbl, timeLbl, screenLbl,
stanLbl, vipLbl, idLbl1, showLbl1, descLbl1, ageLbl1, imgLbl1, imgName;
private JTextField idTxt, showTxt, imgTxt, timeTxt, stanTxt, vipTxt,
idTxt1, showTxt1, imgTxt1;
private JTextArea descTxt, descTxt1;
private JComboBox ageCb, ageCb1, screenCb, timeCb, showingCb;
private JScrollPane descTxtPane, descTxtPane1;
private ArrayList<String> screenList, timeList, showingList;
private DefaultComboBoxModel screenModel, timeModel, showingModel;
private JButton submit, clear, seatSubmit, seatClear, addBtn, subBtn,
submit1, clear1, imgBtn;
private double stanPrice, vipPrice;
private String stanPriceString, vipPriceString, priceExpression, imgString;
private Pattern p;
private File dest, chosenFile;
public AdminWindow() {
//frame properties
setTitle("Admin Panel");
//setSize(Dimensions.getScreenWidth() - 100, Dimensions.getScreenHeight() - 100);
setAlwaysOnTop(true);
// setResizable(false);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setLocationRelativeTo(null);
//regular expression validations
priceExpression = "[0-9]{1,2}[.]{1}[0-9]{2}";
p = Pattern.compile(priceExpression);
//panel dec
tabPane = new JTabbedPane();
adminPanel1 = new JPanel();
adminPanel2 = new JPanel();
adminPanel3 = new JPanel();
g1 = new GridBagConstraints();
g2 = new GridBagConstraints();
g3 = new GridBagConstraints();
//label dec
idLbl = new JLabel("Film ID");
showLbl = new JLabel("Film Name");
descLbl = new JLabel("Film Description");
ageLbl = new JLabel("Age Rating");
imgLbl = new JLabel("Image");
idLbl1 = new JLabel("Film ID");
showLbl1 = new JLabel("Film Name");
descLbl1 = new JLabel("Film Description");
ageLbl1 = new JLabel("Age Rating");
imgLbl1 = new JLabel("Image");
timeLbl = new JLabel("Showing Times");
screenLbl = new JLabel("Screen Number");
stanLbl = new JLabel("Standard Ticket Cost (£)");
vipLbl = new JLabel("VIP Ticket Cost (£)");
imgName = new JLabel("filename.jpg");
//label properties
// imgName.setPreferredSize(new Dimension(100, 20));
//txttfield dec
idTxt = new JTextField(4);
showTxt = new JTextField(30);
descTxt = new JTextArea(4, 30);
descTxtPane = new JScrollPane(descTxt, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
imgTxt = new JTextField();
idTxt1 = new JTextField(4);
showTxt1 = new JTextField(30);
descTxt1 = new JTextArea(4, 30);
descTxtPane1 = new JScrollPane(descTxt1, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
imgTxt1 = new JTextField();
timeTxt = new JTextField(4);
stanTxt = new JTextField(4);
vipTxt = new JTextField(4);
//textfield properties
idTxt1.setEditable(false);
descTxt.setWrapStyleWord(true);
descTxt.setLineWrap(true);
//drop-down dec
ageCb = new JComboBox();
ageCb1 = new JComboBox();
screenCb = new JComboBox();
timeCb = new JComboBox();
showingCb = new JComboBox();
//dropdown properties
// timeCb.setPreferredSize(new Dimension(60, 23));
//buttons
submit = new JButton("Submit");
clear = new JButton("Clear");
submit1 = new JButton("Submit");
clear1 = new JButton("Clear");
seatSubmit = new JButton("Submit");
seatClear = new JButton("Show Current");
addBtn = new JButton("+");
subBtn = new JButton("-");
imgBtn = new JButton("Browse..");
//button properties
addBtn.setFocusPainted(false);
subBtn.setFocusPainted(false);
addBtn.setMargin(new Insets(0, 5, 0, 5));
subBtn.setMargin(new Insets(0, 5, 0, 5));
//listeners
submit.addActionListener(this);
clear.addActionListener(this);
seatSubmit.addActionListener(this);
seatClear.addActionListener(this);
addBtn.addActionListener(this);
subBtn.addActionListener(this);
imgBtn.addActionListener(this);
//fill price text fields with existing prices
defaultForm();
//add items to jcombobox
ageCb.addItem("U");
ageCb.addItem("12A");
ageCb.addItem("15");
ageCb.addItem("18");
ageCb1.addItem("U");
ageCb1.addItem("12A");
ageCb1.addItem("15");
ageCb1.addItem("18");
//panel properties
adminPanel1.setLayout(new GridBagLayout());
adminPanel2.setLayout(new GridBagLayout());
adminPanel3.setLayout(new GridBagLayout());
adminPanel1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "New Showing"));
adminPanel2.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "Seat Prices"));
adminPanel3.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "Edit Showing"));
//ading panels to tabbed pane
tabPane.addTab("Add Showings", null, adminPanel1, "Add new showings & showing times");
tabPane.addTab("Seat Prices", null, adminPanel2, "Change seat prices");
tabPane.addTab("Edit Showing", null, adminPanel3, "Edit existing showing");
//-----adding components to pane--------------------------------------!
g1.gridx = 0;
g1.gridy = 0;
g1.insets = new Insets(10, 0, 0, 10);
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(idLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
g1.fill = GridBagConstraints.HORIZONTAL;
adminPanel1.add(idTxt, g1);
g1.fill = GridBagConstraints.NONE;
g1.gridy++;
g1.gridx--;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(showLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
g1.gridwidth = 4;
g1.fill = GridBagConstraints.HORIZONTAL;
adminPanel1.add(showTxt, g1);
g1.fill = GridBagConstraints.NONE;
g1.gridwidth = 1;
g1.gridy++;
g1.gridx--;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(descLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
g1.gridwidth = 4;
g1.fill = GridBagConstraints.BOTH;
g1.weightx = 1;
g1.weighty = 1;
adminPanel1.add(descTxtPane, g1);
g1.fill = GridBagConstraints.NONE;
g1.weightx = 0;
g1.weighty = 0;
g1.gridwidth = 1;
g1.gridy++;
g1.gridx--;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(ageLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
adminPanel1.add(ageCb, g1);
g1.gridy++;
g1.gridx--;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(imgLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
g1.gridwidth = 2;
adminPanel1.add(imgBtn, g1);
g1.gridx = 3;
adminPanel1.add(imgName, g1);
g1.gridwidth = 1;
g1.gridy++;
g1.gridx = 0;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(screenLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
adminPanel1.add(screenCb, g1);
g1.gridx--;
g1.gridy++;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(timeLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
g1.fill = GridBagConstraints.HORIZONTAL;
adminPanel1.add(timeTxt, g1);
g1.fill = GridBagConstraints.NONE;
g1.gridx++;
adminPanel1.add(addBtn, g1);
g1.gridx++;
adminPanel1.add(timeCb, g1);
g1.gridx++;
adminPanel1.add(subBtn, g1);
//buttons
g1.gridy++;
g1.gridx = 0;
g1.insets = new Insets(10, 0, 10, 10); //top, right, bottom, left
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(clear, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
g1.gridwidth = 4;
adminPanel1.add(submit, g1);
g1.gridwidth = 1;
//------adding components to panel2-----------------------------------!
//left
g2.gridx = 0;
g2.gridy = 0;
g2.insets = new Insets(10, 10, 0, 10);
g2.anchor = GridBagConstraints.LINE_END;
adminPanel2.add(stanLbl, g2);
g2.gridy++;
adminPanel2.add(vipLbl, g2);
g2.gridy++;
adminPanel2.add(seatClear, g2);
//right
g2.gridy = 0;
g2.gridx++;
g2.anchor = GridBagConstraints.LINE_START;
g2.fill = GridBagConstraints.HORIZONTAL;
adminPanel2.add(stanTxt, g2);
g2.fill = GridBagConstraints.NONE;
g2.gridy++;
g2.fill = GridBagConstraints.HORIZONTAL;
adminPanel2.add(vipTxt, g2);
g2.fill = GridBagConstraints.NONE;
g2.gridy++;
adminPanel2.add(seatSubmit, g2);
//-----adminpanel3-----------------------------------------------------
//adding components to panel1
g3.gridx = 1;
g3.gridy = 0;
g3.insets = new Insets(10, 0, 0, 10);
g3.anchor = GridBagConstraints.LINE_START;
g3.gridwidth = 4;
adminPanel3.add(showingCb, g3);
g3.gridwidth = 1;
g3.gridx--;
g3.gridy++;
g3.anchor = GridBagConstraints.LINE_END;
adminPanel3.add(idLbl1, g3);
g3.gridx++;
g3.anchor = GridBagConstraints.LINE_START;
g3.fill = GridBagConstraints.HORIZONTAL;
adminPanel3.add(idTxt1, g3);
g3.fill = GridBagConstraints.NONE;
g3.gridy++;
g3.gridx--;
g3.anchor = GridBagConstraints.LINE_END;
adminPanel3.add(showLbl1, g3);
g3.gridx++;
g3.anchor = GridBagConstraints.LINE_START;
g3.gridwidth = 5;
g3.fill = GridBagConstraints.HORIZONTAL;
adminPanel3.add(showTxt1, g3);
g3.fill = GridBagConstraints.NONE;
g3.gridwidth = 1;
g3.gridy++;
g3.gridx--;
g3.anchor = GridBagConstraints.LINE_END;
adminPanel3.add(descLbl1, g3);
g3.gridx++;
g3.anchor = GridBagConstraints.LINE_START;
g3.gridwidth = 4;
g3.fill = GridBagConstraints.BOTH;
g3.weightx = 1;
g3.weighty = 1;
adminPanel3.add(descTxtPane1, g3);
g3.fill = GridBagConstraints.NONE;
g3.weightx = 0;
g3.weighty = 0;
g3.gridwidth = 1;
g3.gridy++;
g3.gridx--;
g3.anchor = GridBagConstraints.LINE_END;
adminPanel3.add(ageLbl1, g3);
g3.gridx++;
g3.anchor = GridBagConstraints.LINE_START;
adminPanel3.add(ageCb1, g3);
g3.gridy++;
g3.gridx--;
//buttons
g3.gridy++;
g3.gridx = 0;
g3.insets = new Insets(10, 0, 10, 10); //top, right, bottom, left
g3.anchor = GridBagConstraints.LINE_END;
adminPanel3.add(clear1, g3);
g3.gridx++;
g3.anchor = GridBagConstraints.LINE_START;
g3.gridwidth = 4;
adminPanel3.add(submit1, g3);
g3.gridwidth = 1;
//adding tabbed pane to frame
this.add(tabPane);
this.pack();
//visibility
setVisible(true);
tabPane.setVisible(true);
//actionlisteners
}
public static void main(String[] args) {
AdminWindow test = new AdminWindow();
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == imgBtn) {
//--JFileChooser, ugly but better to use--
String userDir = System.getProperty("user.home");
JFileChooser chooser = new JFileChooser(userDir + "/Desktop");
int choice = chooser.showDialog(this, "Choose");
if (choice != JFileChooser.APPROVE_OPTION) {
return;
}
FileNameExtensionFilter filter = new FileNameExtensionFilter("Image Files", "jpg", "png", "gif", "jpeg");
chooser.setAcceptAllFileFilterUsed(false);
chooser.addChoosableFileFilter(filter);
chosenFile = chooser.getSelectedFile();
imgName.setText(chosenFile.getName());
dest = new File(System.getProperty("user.dir") + "/src/iegroup/resources", chosenFile.getName());
imgString = "resources/" + chosenFile.getName();
System.out.println(dest.toPath());
}
if (e.getSource() == submit) {
if (e.getSource() == clear) {
}
if (e.getSource() == seatSubmit) {
}
}
if (e.getSource() == seatClear) {
defaultForm();
}
if (e.getSource() == addBtn) {
timeModel.addElement(timeTxt.getText());
timeList.add(timeTxt.getText());
}
if (e.getSource() == subBtn) {
timeModel.removeElement(timeCb.getSelectedItem());
timeList.remove(timeCb.getSelectedItem());
}
}
private void defaultForm() {
stanPriceString = String.format("%.2f", stanPrice);
vipPriceString = String.format("%.2f", vipPrice);
stanTxt.setText(stanPriceString);
vipTxt.setText(vipPriceString);
}
public void showValidationPrompt(String message) {
JFrame validFrame = new JFrame();
validFrame.setAlwaysOnTop(true);
JOptionPane.showMessageDialog(validFrame, message, "Invalid input", JOptionPane.CLOSED_OPTION);
}
public void showSuccessPrompt(String message) {
JFrame errorFrame = new JFrame();
errorFrame.setAlwaysOnTop(true);
JOptionPane.showMessageDialog(errorFrame, message, "Success", JOptionPane.CLOSED_OPTION);
}
}
我在 JDialog
框中有一个 JTabbedPane
,它在窗格中包含的所有 JPanels
上使用 GridBagLayout
。在显示的第一个面板上有一个 JTextArea
(descTxt
) 可以输入电影描述。当您在 JTextArea
中输入大量文本时,它似乎很好,直到您单击面板上不是组件的任意位置(空灰色 space),然后所有文本字段和文本窗格都缩小到看起来像 0 的大小。
这里有一些要粘贴和测试的示例文本:
During a manned mission to Mars, Astronaut Mark Watney is presumed dead after a fierce storm and left behind by his crew. But Watney has survived and finds himself stranded and alone on the hostile planet. With only meager supplies, he must draw upon his ingenuity, wit and spirit to subsist and find a way to signal to Earth that he is alive.
这是我的代码的可运行示例:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.regex.Pattern;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.filechooser.FileNameExtensionFilter;
/**
*
* @author Chris
*/
public class AdminWindow extends JDialog implements ActionListener {
private JPanel adminPanel1, adminPanel2, adminPanel3;
private JTabbedPane tabPane;
private GridBagConstraints g1, g2, g3;
private JLabel idLbl, showLbl, descLbl, ageLbl, imgLbl, timeLbl, screenLbl,
stanLbl, vipLbl, idLbl1, showLbl1, descLbl1, ageLbl1, imgLbl1, imgName;
private JTextField idTxt, showTxt, imgTxt, timeTxt, stanTxt, vipTxt,
idTxt1, showTxt1, imgTxt1;
private JTextArea descTxt, descTxt1;
private JComboBox ageCb, ageCb1, screenCb, timeCb, showingCb;
private JScrollPane descTxtPane, descTxtPane1;
private ArrayList<String> screenList, timeList, showingList;
private DefaultComboBoxModel screenModel, timeModel, showingModel;
private JButton submit, clear, seatSubmit, seatClear, addBtn, subBtn,
submit1, clear1, imgBtn;
private double stanPrice, vipPrice;
private String stanPriceString, vipPriceString, priceExpression, imgString;
private Pattern p;
private File dest, chosenFile;
public AdminWindow() {
//frame properties
super(new JFrame("Admin Panel"));
setTitle("Admin Panel");
//setSize(Dimensions.getScreenWidth() - 100, Dimensions.getScreenHeight() - 100);
setAlwaysOnTop(true);
setResizable(false);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setLocationRelativeTo(null);
//regular expression validations
priceExpression = "[0-9]{1,2}[.]{1}[0-9]{2}";
p = Pattern.compile(priceExpression);
//panel dec
tabPane = new JTabbedPane();
adminPanel1 = new JPanel();
adminPanel2 = new JPanel();
adminPanel3 = new JPanel();
g1 = new GridBagConstraints();
g2 = new GridBagConstraints();
g3 = new GridBagConstraints();
//label dec
idLbl = new JLabel("Film ID");
showLbl = new JLabel("Film Name");
descLbl = new JLabel("Film Description");
ageLbl = new JLabel("Age Rating");
imgLbl = new JLabel("Image");
idLbl1 = new JLabel("Film ID");
showLbl1 = new JLabel("Film Name");
descLbl1 = new JLabel("Film Description");
ageLbl1 = new JLabel("Age Rating");
imgLbl1 = new JLabel("Image");
timeLbl = new JLabel("Showing Times");
screenLbl = new JLabel("Screen Number");
stanLbl = new JLabel("Standard Ticket Cost (£)");
vipLbl = new JLabel("VIP Ticket Cost (£)");
imgName = new JLabel("filename.jpg");
//label properties
imgName.setPreferredSize(new Dimension(100, 20));
//txttfield dec
idTxt = new JTextField(4);
showTxt = new JTextField(30);
descTxt = new JTextArea(4, 30);
descTxtPane = new JScrollPane(descTxt, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
imgTxt = new JTextField();
idTxt1 = new JTextField(4);
showTxt1 = new JTextField(30);
descTxt1 = new JTextArea(4, 30);
descTxtPane1 = new JScrollPane(descTxt1, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
imgTxt1 = new JTextField();
timeTxt = new JTextField(4);
stanTxt = new JTextField(4);
vipTxt = new JTextField(4);
//textfield properties
idTxt1.setEditable(false);
descTxt.setWrapStyleWord(true);
descTxt.setLineWrap(true);
//drop-down dec
ageCb = new JComboBox();
ageCb1 = new JComboBox();
screenCb = new JComboBox();
timeCb = new JComboBox();
showingCb = new JComboBox();
//dropdown properties
timeCb.setPreferredSize(new Dimension(60, 23));
//buttons
submit = new JButton("Submit");
clear = new JButton("Clear");
submit1 = new JButton("Submit");
clear1 = new JButton("Clear");
seatSubmit = new JButton("Submit");
seatClear = new JButton("Show Current");
addBtn = new JButton("+");
subBtn = new JButton("-");
imgBtn = new JButton("Browse..");
//button properties
addBtn.setFocusPainted(false);
subBtn.setFocusPainted(false);
addBtn.setMargin(new Insets(0, 5, 0, 5));
subBtn.setMargin(new Insets(0, 5, 0, 5));
//listeners
submit.addActionListener(this);
clear.addActionListener(this);
seatSubmit.addActionListener(this);
seatClear.addActionListener(this);
addBtn.addActionListener(this);
subBtn.addActionListener(this);
imgBtn.addActionListener(this);
//fill price text fields with existing prices
defaultForm();
//add items to jcombobox
ageCb.addItem("U");
ageCb.addItem("12A");
ageCb.addItem("15");
ageCb.addItem("18");
ageCb1.addItem("U");
ageCb1.addItem("12A");
ageCb1.addItem("15");
ageCb1.addItem("18");
//panel properties
adminPanel1.setLayout(new GridBagLayout());
adminPanel2.setLayout(new GridBagLayout());
adminPanel3.setLayout(new GridBagLayout());
adminPanel1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "New Showing"));
adminPanel2.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "Seat Prices"));
adminPanel3.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "Edit Showing"));
//ading panels to tabbed pane
tabPane.addTab("Add Showings", null, adminPanel1, "Add new showings & showing times");
tabPane.addTab("Seat Prices", null, adminPanel2, "Change seat prices");
tabPane.addTab("Edit Showing", null, adminPanel3, "Edit existing showing");
//-----adding components to pane--------------------------------------!
g1.gridx = 0;
g1.gridy = 0;
g1.insets = new Insets(10, 0, 0, 10);
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(idLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
adminPanel1.add(idTxt, g1);
g1.gridy++;
g1.gridx--;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(showLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
g1.gridwidth = 4;
adminPanel1.add(showTxt, g1);
g1.gridwidth = 1;
g1.gridy++;
g1.gridx--;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(descLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
g1.gridwidth = 4;
adminPanel1.add(descTxtPane, g1);
g1.gridwidth = 1;
g1.gridy++;
g1.gridx--;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(ageLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
adminPanel1.add(ageCb, g1);
g1.gridy++;
g1.gridx--;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(imgLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
g1.gridwidth = 2;
adminPanel1.add(imgBtn, g1);
g1.gridx = 3;
adminPanel1.add(imgName, g1);
g1.gridwidth = 1;
g1.gridy++;
g1.gridx = 0;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(screenLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
adminPanel1.add(screenCb, g1);
g1.gridx--;
g1.gridy++;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(timeLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
adminPanel1.add(timeTxt, g1);
g1.gridx++;
adminPanel1.add(addBtn, g1);
g1.gridx++;
adminPanel1.add(timeCb, g1);
g1.gridx++;
adminPanel1.add(subBtn, g1);
//buttons
g1.gridy++;
g1.gridx = 0;
g1.insets = new Insets(10, 0, 10, 10); //top, right, bottom, left
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(clear, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
g1.gridwidth = 4;
adminPanel1.add(submit, g1);
g1.gridwidth = 1;
//------adding components to panel2-----------------------------------!
//left
g2.gridx = 0;
g2.gridy = 0;
g2.insets = new Insets(10, 10, 0, 10);
g2.anchor = GridBagConstraints.LINE_END;
adminPanel2.add(stanLbl, g2);
g2.gridy++;
adminPanel2.add(vipLbl, g2);
g2.gridy++;
adminPanel2.add(seatClear, g2);
//right
g2.gridy = 0;
g2.gridx++;
g2.anchor = GridBagConstraints.LINE_START;
adminPanel2.add(stanTxt, g2);
g2.gridy++;
adminPanel2.add(vipTxt, g2);
g2.gridy++;
adminPanel2.add(seatSubmit, g2);
//-----adminpanel3-----------------------------------------------------
//adding components to panel1
g3.gridx = 1;
g3.gridy = 0;
g3.insets = new Insets(10, 0, 0, 10);
g3.anchor = GridBagConstraints.LINE_START;
g3.gridwidth = 4;
adminPanel3.add(showingCb, g3);
g3.gridwidth = 1;
g3.gridx--;
g3.gridy++;
g3.anchor = GridBagConstraints.LINE_END;
adminPanel3.add(idLbl1, g3);
g3.gridx++;
g3.anchor = GridBagConstraints.LINE_START;
adminPanel3.add(idTxt1, g3);
g3.gridy++;
g3.gridx--;
g3.anchor = GridBagConstraints.LINE_END;
adminPanel3.add(showLbl1, g3);
g3.gridx++;
g3.anchor = GridBagConstraints.LINE_START;
g3.gridwidth = 5;
adminPanel3.add(showTxt1, g3);
g3.gridwidth = 1;
g3.gridy++;
g3.gridx--;
g3.anchor = GridBagConstraints.LINE_END;
adminPanel3.add(descLbl1, g3);
g3.gridx++;
g3.anchor = GridBagConstraints.LINE_START;
g3.gridwidth = 4;
adminPanel3.add(descTxtPane1, g3);
g3.gridwidth = 1;
g3.gridy++;
g3.gridx--;
g3.anchor = GridBagConstraints.LINE_END;
adminPanel3.add(ageLbl1, g3);
g3.gridx++;
g3.anchor = GridBagConstraints.LINE_START;
adminPanel3.add(ageCb1, g3);
g3.gridy++;
g3.gridx--;
//buttons
g3.gridy++;
g3.gridx = 0;
g3.insets = new Insets(10, 0, 10, 10); //top, right, bottom, left
g3.anchor = GridBagConstraints.LINE_END;
adminPanel3.add(clear1, g3);
g3.gridx++;
g3.anchor = GridBagConstraints.LINE_START;
g3.gridwidth = 4;
adminPanel3.add(submit1, g3);
g3.gridwidth = 1;
//adding tabbed pane to frame
this.add(tabPane);
this.pack();
//visibility
setVisible(true);
tabPane.setVisible(true);
//actionlisteners
}
public static void main(String[] args) {
AdminWindow test = new AdminWindow();
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == imgBtn) {
//--JFileChooser, ugly but better to use--
String userDir = System.getProperty("user.home");
JFileChooser chooser = new JFileChooser(userDir+"/Desktop");
int choice = chooser.showDialog(this, "Choose");
if (choice != JFileChooser.APPROVE_OPTION) {
return;
}
FileNameExtensionFilter filter = new FileNameExtensionFilter("Image Files", "jpg", "png", "gif", "jpeg");
chooser.setAcceptAllFileFilterUsed(false);
chooser.addChoosableFileFilter(filter);
chosenFile = chooser.getSelectedFile();
imgName.setText(chosenFile.getName());
dest = new File(System.getProperty("user.dir") + "/src/iegroup/resources", chosenFile.getName());
imgString = "resources/" + chosenFile.getName();
System.out.println(dest.toPath());
}
if (e.getSource() == submit) {
if (e.getSource() == clear ){
}
if (e.getSource() == seatSubmit) {
}
}
if (e.getSource() == seatClear) {
defaultForm();
}
if (e.getSource() == addBtn) {
timeModel.addElement(timeTxt.getText());
timeList.add(timeTxt.getText());
}
if (e.getSource() == subBtn) {
timeModel.removeElement(timeCb.getSelectedItem());
timeList.remove(timeCb.getSelectedItem());
}
}
private void defaultForm() {
stanPriceString = String.format("%.2f", stanPrice);
vipPriceString = String.format("%.2f", vipPrice);
stanTxt.setText(stanPriceString);
vipTxt.setText(vipPriceString);
}
public void showValidationPrompt(String message) {
JFrame validFrame = new JFrame();
validFrame.setAlwaysOnTop(true);
JOptionPane.showMessageDialog(validFrame, message, "Invalid input", JOptionPane.CLOSED_OPTION);
}
public void showSuccessPrompt(String message) {
JFrame errorFrame = new JFrame();
errorFrame.setAlwaysOnTop(true);
JOptionPane.showMessageDialog(errorFrame, message, "Success", JOptionPane.CLOSED_OPTION);
}
}
请帮忙。这个非常令人困惑,我似乎无法在任何地方找到解决方案。
所以,问题似乎是 setResizable(false)
和 ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED
的组合(好吧,我只是讨厌不可调整大小 windows)。
发生的事情是,当您填充 JTextArea
时,"adding" 和 JScrollPane
变成了 "packed" window,所以组件的大小有改变了,那么当容器重新生效时,不再有足够的 space 剩余来将所有字段打包成它们的首选大小,所以它们被调整到它们的最小大小,通常是 0x0
或足够接近。
您可以做一些事情来帮助事情顺利进行。您可以对文本字段使用 GridBagConstraints#fill
并使用 GridBagConstraints.HORIZONTAL
,对文本区域使用 GridBagConstraints.BOTH
,这将允许字段 "fill" 并占用可用的 [= column/row 的 58=],无论何时单元格 space 小于组件的首选大小。
您可能还会发现 GridBagConstraints#weightx/y
到 1
可以提供帮助。
如果您遇到了真正的麻烦,您可以简单地在 JScrollPane
中使用 ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS
,虽然不漂亮,但会在 [=] 中添加 JScrollBar
大小16=] 当 window 被打包时
已更新
所以,基本上,我最终将 fill
和 weightx/y
组合用于 JScrollPane
和 JTextArea
s
g1.fill = GridBagConstraints.BOTH;
g1.weightx = 1;
g1.weighty = 1;
adminPanel1.add(descTxtPane, g1);
g1.fill = GridBagConstraints.NONE;
g1.weightx = 0;
g1.weighty = 0;
对于 JTextField
s 我刚刚使用了 fill
似乎已经稳定了事情...
g1.fill = GridBagConstraints.HORIZONTAL;
adminPanel1.add(idTxt, g1);
g1.fill = GridBagConstraints.NONE;
这导致了类似...
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.regex.Pattern;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.filechooser.FileNameExtensionFilter;
public class AdminWindow extends JDialog implements ActionListener {
private JPanel adminPanel1, adminPanel2, adminPanel3;
private JTabbedPane tabPane;
private GridBagConstraints g1, g2, g3;
private JLabel idLbl, showLbl, descLbl, ageLbl, imgLbl, timeLbl, screenLbl,
stanLbl, vipLbl, idLbl1, showLbl1, descLbl1, ageLbl1, imgLbl1, imgName;
private JTextField idTxt, showTxt, imgTxt, timeTxt, stanTxt, vipTxt,
idTxt1, showTxt1, imgTxt1;
private JTextArea descTxt, descTxt1;
private JComboBox ageCb, ageCb1, screenCb, timeCb, showingCb;
private JScrollPane descTxtPane, descTxtPane1;
private ArrayList<String> screenList, timeList, showingList;
private DefaultComboBoxModel screenModel, timeModel, showingModel;
private JButton submit, clear, seatSubmit, seatClear, addBtn, subBtn,
submit1, clear1, imgBtn;
private double stanPrice, vipPrice;
private String stanPriceString, vipPriceString, priceExpression, imgString;
private Pattern p;
private File dest, chosenFile;
public AdminWindow() {
//frame properties
setTitle("Admin Panel");
//setSize(Dimensions.getScreenWidth() - 100, Dimensions.getScreenHeight() - 100);
setAlwaysOnTop(true);
// setResizable(false);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setLocationRelativeTo(null);
//regular expression validations
priceExpression = "[0-9]{1,2}[.]{1}[0-9]{2}";
p = Pattern.compile(priceExpression);
//panel dec
tabPane = new JTabbedPane();
adminPanel1 = new JPanel();
adminPanel2 = new JPanel();
adminPanel3 = new JPanel();
g1 = new GridBagConstraints();
g2 = new GridBagConstraints();
g3 = new GridBagConstraints();
//label dec
idLbl = new JLabel("Film ID");
showLbl = new JLabel("Film Name");
descLbl = new JLabel("Film Description");
ageLbl = new JLabel("Age Rating");
imgLbl = new JLabel("Image");
idLbl1 = new JLabel("Film ID");
showLbl1 = new JLabel("Film Name");
descLbl1 = new JLabel("Film Description");
ageLbl1 = new JLabel("Age Rating");
imgLbl1 = new JLabel("Image");
timeLbl = new JLabel("Showing Times");
screenLbl = new JLabel("Screen Number");
stanLbl = new JLabel("Standard Ticket Cost (£)");
vipLbl = new JLabel("VIP Ticket Cost (£)");
imgName = new JLabel("filename.jpg");
//label properties
// imgName.setPreferredSize(new Dimension(100, 20));
//txttfield dec
idTxt = new JTextField(4);
showTxt = new JTextField(30);
descTxt = new JTextArea(4, 30);
descTxtPane = new JScrollPane(descTxt, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
imgTxt = new JTextField();
idTxt1 = new JTextField(4);
showTxt1 = new JTextField(30);
descTxt1 = new JTextArea(4, 30);
descTxtPane1 = new JScrollPane(descTxt1, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
imgTxt1 = new JTextField();
timeTxt = new JTextField(4);
stanTxt = new JTextField(4);
vipTxt = new JTextField(4);
//textfield properties
idTxt1.setEditable(false);
descTxt.setWrapStyleWord(true);
descTxt.setLineWrap(true);
//drop-down dec
ageCb = new JComboBox();
ageCb1 = new JComboBox();
screenCb = new JComboBox();
timeCb = new JComboBox();
showingCb = new JComboBox();
//dropdown properties
// timeCb.setPreferredSize(new Dimension(60, 23));
//buttons
submit = new JButton("Submit");
clear = new JButton("Clear");
submit1 = new JButton("Submit");
clear1 = new JButton("Clear");
seatSubmit = new JButton("Submit");
seatClear = new JButton("Show Current");
addBtn = new JButton("+");
subBtn = new JButton("-");
imgBtn = new JButton("Browse..");
//button properties
addBtn.setFocusPainted(false);
subBtn.setFocusPainted(false);
addBtn.setMargin(new Insets(0, 5, 0, 5));
subBtn.setMargin(new Insets(0, 5, 0, 5));
//listeners
submit.addActionListener(this);
clear.addActionListener(this);
seatSubmit.addActionListener(this);
seatClear.addActionListener(this);
addBtn.addActionListener(this);
subBtn.addActionListener(this);
imgBtn.addActionListener(this);
//fill price text fields with existing prices
defaultForm();
//add items to jcombobox
ageCb.addItem("U");
ageCb.addItem("12A");
ageCb.addItem("15");
ageCb.addItem("18");
ageCb1.addItem("U");
ageCb1.addItem("12A");
ageCb1.addItem("15");
ageCb1.addItem("18");
//panel properties
adminPanel1.setLayout(new GridBagLayout());
adminPanel2.setLayout(new GridBagLayout());
adminPanel3.setLayout(new GridBagLayout());
adminPanel1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "New Showing"));
adminPanel2.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "Seat Prices"));
adminPanel3.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "Edit Showing"));
//ading panels to tabbed pane
tabPane.addTab("Add Showings", null, adminPanel1, "Add new showings & showing times");
tabPane.addTab("Seat Prices", null, adminPanel2, "Change seat prices");
tabPane.addTab("Edit Showing", null, adminPanel3, "Edit existing showing");
//-----adding components to pane--------------------------------------!
g1.gridx = 0;
g1.gridy = 0;
g1.insets = new Insets(10, 0, 0, 10);
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(idLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
g1.fill = GridBagConstraints.HORIZONTAL;
adminPanel1.add(idTxt, g1);
g1.fill = GridBagConstraints.NONE;
g1.gridy++;
g1.gridx--;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(showLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
g1.gridwidth = 4;
g1.fill = GridBagConstraints.HORIZONTAL;
adminPanel1.add(showTxt, g1);
g1.fill = GridBagConstraints.NONE;
g1.gridwidth = 1;
g1.gridy++;
g1.gridx--;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(descLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
g1.gridwidth = 4;
g1.fill = GridBagConstraints.BOTH;
g1.weightx = 1;
g1.weighty = 1;
adminPanel1.add(descTxtPane, g1);
g1.fill = GridBagConstraints.NONE;
g1.weightx = 0;
g1.weighty = 0;
g1.gridwidth = 1;
g1.gridy++;
g1.gridx--;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(ageLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
adminPanel1.add(ageCb, g1);
g1.gridy++;
g1.gridx--;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(imgLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
g1.gridwidth = 2;
adminPanel1.add(imgBtn, g1);
g1.gridx = 3;
adminPanel1.add(imgName, g1);
g1.gridwidth = 1;
g1.gridy++;
g1.gridx = 0;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(screenLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
adminPanel1.add(screenCb, g1);
g1.gridx--;
g1.gridy++;
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(timeLbl, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
g1.fill = GridBagConstraints.HORIZONTAL;
adminPanel1.add(timeTxt, g1);
g1.fill = GridBagConstraints.NONE;
g1.gridx++;
adminPanel1.add(addBtn, g1);
g1.gridx++;
adminPanel1.add(timeCb, g1);
g1.gridx++;
adminPanel1.add(subBtn, g1);
//buttons
g1.gridy++;
g1.gridx = 0;
g1.insets = new Insets(10, 0, 10, 10); //top, right, bottom, left
g1.anchor = GridBagConstraints.LINE_END;
adminPanel1.add(clear, g1);
g1.gridx++;
g1.anchor = GridBagConstraints.LINE_START;
g1.gridwidth = 4;
adminPanel1.add(submit, g1);
g1.gridwidth = 1;
//------adding components to panel2-----------------------------------!
//left
g2.gridx = 0;
g2.gridy = 0;
g2.insets = new Insets(10, 10, 0, 10);
g2.anchor = GridBagConstraints.LINE_END;
adminPanel2.add(stanLbl, g2);
g2.gridy++;
adminPanel2.add(vipLbl, g2);
g2.gridy++;
adminPanel2.add(seatClear, g2);
//right
g2.gridy = 0;
g2.gridx++;
g2.anchor = GridBagConstraints.LINE_START;
g2.fill = GridBagConstraints.HORIZONTAL;
adminPanel2.add(stanTxt, g2);
g2.fill = GridBagConstraints.NONE;
g2.gridy++;
g2.fill = GridBagConstraints.HORIZONTAL;
adminPanel2.add(vipTxt, g2);
g2.fill = GridBagConstraints.NONE;
g2.gridy++;
adminPanel2.add(seatSubmit, g2);
//-----adminpanel3-----------------------------------------------------
//adding components to panel1
g3.gridx = 1;
g3.gridy = 0;
g3.insets = new Insets(10, 0, 0, 10);
g3.anchor = GridBagConstraints.LINE_START;
g3.gridwidth = 4;
adminPanel3.add(showingCb, g3);
g3.gridwidth = 1;
g3.gridx--;
g3.gridy++;
g3.anchor = GridBagConstraints.LINE_END;
adminPanel3.add(idLbl1, g3);
g3.gridx++;
g3.anchor = GridBagConstraints.LINE_START;
g3.fill = GridBagConstraints.HORIZONTAL;
adminPanel3.add(idTxt1, g3);
g3.fill = GridBagConstraints.NONE;
g3.gridy++;
g3.gridx--;
g3.anchor = GridBagConstraints.LINE_END;
adminPanel3.add(showLbl1, g3);
g3.gridx++;
g3.anchor = GridBagConstraints.LINE_START;
g3.gridwidth = 5;
g3.fill = GridBagConstraints.HORIZONTAL;
adminPanel3.add(showTxt1, g3);
g3.fill = GridBagConstraints.NONE;
g3.gridwidth = 1;
g3.gridy++;
g3.gridx--;
g3.anchor = GridBagConstraints.LINE_END;
adminPanel3.add(descLbl1, g3);
g3.gridx++;
g3.anchor = GridBagConstraints.LINE_START;
g3.gridwidth = 4;
g3.fill = GridBagConstraints.BOTH;
g3.weightx = 1;
g3.weighty = 1;
adminPanel3.add(descTxtPane1, g3);
g3.fill = GridBagConstraints.NONE;
g3.weightx = 0;
g3.weighty = 0;
g3.gridwidth = 1;
g3.gridy++;
g3.gridx--;
g3.anchor = GridBagConstraints.LINE_END;
adminPanel3.add(ageLbl1, g3);
g3.gridx++;
g3.anchor = GridBagConstraints.LINE_START;
adminPanel3.add(ageCb1, g3);
g3.gridy++;
g3.gridx--;
//buttons
g3.gridy++;
g3.gridx = 0;
g3.insets = new Insets(10, 0, 10, 10); //top, right, bottom, left
g3.anchor = GridBagConstraints.LINE_END;
adminPanel3.add(clear1, g3);
g3.gridx++;
g3.anchor = GridBagConstraints.LINE_START;
g3.gridwidth = 4;
adminPanel3.add(submit1, g3);
g3.gridwidth = 1;
//adding tabbed pane to frame
this.add(tabPane);
this.pack();
//visibility
setVisible(true);
tabPane.setVisible(true);
//actionlisteners
}
public static void main(String[] args) {
AdminWindow test = new AdminWindow();
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == imgBtn) {
//--JFileChooser, ugly but better to use--
String userDir = System.getProperty("user.home");
JFileChooser chooser = new JFileChooser(userDir + "/Desktop");
int choice = chooser.showDialog(this, "Choose");
if (choice != JFileChooser.APPROVE_OPTION) {
return;
}
FileNameExtensionFilter filter = new FileNameExtensionFilter("Image Files", "jpg", "png", "gif", "jpeg");
chooser.setAcceptAllFileFilterUsed(false);
chooser.addChoosableFileFilter(filter);
chosenFile = chooser.getSelectedFile();
imgName.setText(chosenFile.getName());
dest = new File(System.getProperty("user.dir") + "/src/iegroup/resources", chosenFile.getName());
imgString = "resources/" + chosenFile.getName();
System.out.println(dest.toPath());
}
if (e.getSource() == submit) {
if (e.getSource() == clear) {
}
if (e.getSource() == seatSubmit) {
}
}
if (e.getSource() == seatClear) {
defaultForm();
}
if (e.getSource() == addBtn) {
timeModel.addElement(timeTxt.getText());
timeList.add(timeTxt.getText());
}
if (e.getSource() == subBtn) {
timeModel.removeElement(timeCb.getSelectedItem());
timeList.remove(timeCb.getSelectedItem());
}
}
private void defaultForm() {
stanPriceString = String.format("%.2f", stanPrice);
vipPriceString = String.format("%.2f", vipPrice);
stanTxt.setText(stanPriceString);
vipTxt.setText(vipPriceString);
}
public void showValidationPrompt(String message) {
JFrame validFrame = new JFrame();
validFrame.setAlwaysOnTop(true);
JOptionPane.showMessageDialog(validFrame, message, "Invalid input", JOptionPane.CLOSED_OPTION);
}
public void showSuccessPrompt(String message) {
JFrame errorFrame = new JFrame();
errorFrame.setAlwaysOnTop(true);
JOptionPane.showMessageDialog(errorFrame, message, "Success", JOptionPane.CLOSED_OPTION);
}
}