Java JTextArea在调整对话框大小时突然调整大小
我在使用Java JTextArea在调整对话框大小时突然调整大小,java,swing,layout,jtextarea,Java,Swing,Layout,Jtextarea,我在使用JTextArea时遇到问题。我的实际设置不同,但效果仍然存在。以下是问题的图像: 当拥有的JDialog的大小仅比JTextArea所需的首选大小低1个像素时,文本区域就会突然调整大小。在我的实际设置中,它们突然变高。我使用的是GridBagLayout,但它似乎发生在其他布局中。为什么会这样 下面是复制上述效果的易于编译的代码 import java.awt.*; import java.awt.event.*; import java.text.SimpleDateFormat;
JTextArea
时遇到问题。我的实际设置不同,但效果仍然存在。以下是问题的图像:
当拥有的JDialog
的大小仅比JTextArea
所需的首选大小低1个像素时,文本区域就会突然调整大小。在我的实际设置中,它们突然变高。我使用的是GridBagLayout
,但它似乎发生在其他布局中。为什么会这样
下面是复制上述效果的易于编译的代码
import java.awt.*;
import java.awt.event.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.*;
import javax.swing.text.JTextComponent;
public class TextDemo extends JDialog implements ActionListener {
private static final long serialVersionUID = -589374238138963529L;
protected JTextField textField;
protected JTextArea textArea;
private final static String newline = "\n";
private static final java.awt.Dimension SCREENSIZE =
java.awt.Toolkit.getDefaultToolkit().getScreenSize();
private static final java.awt.Point SCREENCENTER =
new java.awt.Point(SCREENSIZE.width/2,SCREENSIZE.height/2);
public TextDemo(Window owner, String shortMessage, String message, JComponent accessory) {
super(owner);
setTitle("Test");
setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
Icon icon = UIManager.getIcon("OptionPane.warningIcon");
JTextArea shortText = makeMultiLineLabel(true);
shortText.setBorder(BorderFactory.createEtchedBorder());
shortText.setFont(shortText.getFont().deriveFont(Font.BOLD));
shortText.setRows(2);
shortText.setColumns(20);
shortText.setText(shortMessage);
JTextArea messageText = makeMultiLineLabel(true);
messageText.setBorder(BorderFactory.createEtchedBorder());
messageText.setFont(shortText.getFont().deriveFont(Font.PLAIN));
messageText.setRows(4);
messageText.setColumns(20);
messageText.setText(message);
JPanel buttonPanel = new JPanel();
buttonPanel.add(new JButton("OK"));
buttonPanel.add(new JButton("Cancel"));
JPanel contentPanel = new JPanel();
contentPanel.setOpaque(true);
contentPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 8, 9));
contentPanel.setLayout(new GridBagLayout());
GridBagConstraints c;
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.anchor = GridBagConstraints.FIRST_LINE_START;
c.gridheight = 2;
contentPanel.add(new JLabel(icon), c);
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 0;
c.fill = GridBagConstraints.BOTH;
c.weighty = 1.0;
c.weightx = 1.0;
contentPanel.add(shortText, c);
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 1;
c.fill = GridBagConstraints.BOTH;
c.weighty = 1.0;
c.weightx = 1.0;
contentPanel.add(messageText, c);
if (accessory != null) {
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 2;
c.gridwidth = 2;
c.fill = GridBagConstraints.BOTH;
c.weighty = 1.0;
c.weightx = 1.0;
contentPanel.add(accessory, c);
}
c = new GridBagConstraints();
c.gridwidth = 2;
c.gridx = 0;
c.gridy = 3;
contentPanel.add(buttonPanel, c);
setContentPane(contentPanel);
}
public void actionPerformed(ActionEvent evt) {
String text = textField.getText();
textArea.append(text + newline);
textField.selectAll();
//Make sure the new text is visible, even if there
//was a selection in the text area.
textArea.setCaretPosition(textArea.getDocument().getLength());
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event dispatch thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("TextDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
throw new Exception("Test");
} catch (Exception e) {
TextDemo t = new TextDemo(frame, "You won't get away with this!",
"Alert! Alert! A chocy nut bar has been removed without payment!" +
" A chocy nut bar... has been REMOVED! WITHOUT PAYMENT! Alert, alert!",
getStackTraceTextArea(e));
//Display the window.
frame.pack();
frame.setLocation(SCREENCENTER.x - frame.getSize().width/2,
SCREENCENTER.y - frame.getSize().height/2);
frame.setVisible(true);
t.setModal(true);
t.pack();
t.setLocation(getPos(t, t.getOwner()));
t.setVisible(true);
}
}
protected static JComponent getStackTraceTextArea(Throwable exception) {
JTextArea textArea = new JTextArea();
textArea.setEditable(false);
textArea.setLineWrap(false);
textArea.append(getTraceMessage(exception));
textArea.setCaretPosition(0);
JScrollPane scroll = new JScrollPane(textArea);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scroll.setPreferredSize(new Dimension(50, 140));
return scroll;
}
private static final String getTraceMessage(Throwable exception) {
StringBuilder out = new StringBuilder((new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"))
.format(new Date())+": Unhandled Exception: \n"
+exception.toString()+"\n\nStack Trace:\n");
StackTraceElement[] stackTrace = exception.getStackTrace();
for (int i = 0; i < stackTrace.length; i++) {
String toAppend = stackTrace[i].toString();
if (i != stackTrace.length-1) toAppend += "\n";
out.append(toAppend);
}
return out.toString();
}
public static final JTextArea makeMultiLineLabel(boolean selectable) {
JTextArea area = new JTextArea();
area.setWrapStyleWord(true);
area.setLineWrap(true);
area.setFont(UIManager.getFont("Label.font"));
area.setEditable(false);
area.setCursor(null);
area.setOpaque(false);
area.setFocusable(selectable);
area.setAlignmentX(JTextComponent.LEFT_ALIGNMENT);
area.setMinimumSize(new Dimension(0,0));
return area;
}
private static Point getPos(JDialog d, Window w) {
return new Point(w.getX()+(w.getWidth ()-d.getWidth ())/2,
w.getY()+(w.getHeight()-d.getHeight())/2);
}
public static void main(String[] args) {
//Schedule a job for the event dispatch thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
import java.awt.*;
导入java.awt.event.*;
导入java.text.simpleDataFormat;
导入java.util.Date;
导入javax.swing.*;
导入javax.swing.text.JTextComponent;
公共类TextDemo扩展JDialog实现ActionListener{
私有静态最终长serialVersionUID=-589374238138963529L;
受保护的JTextField textField;
保护区;
私有最终静态字符串换行符=“\n”;
私有静态最终java.awt.Dimension屏幕大小=
java.awt.Toolkit.getDefaultToolkit().getScreenSize();
私有静态最终java.awt.Point屏幕中心=
新的java.awt.Point(SCREENSIZE.width/2,SCREENSIZE.height/2);
公共文本演示(窗口所有者、字符串短消息、字符串消息、JComponent附件){
超级(业主);
设置标题(“测试”);
setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
Icon-Icon=UIManager.getIcon(“OptionPane.warningIcon”);
JTextArea shortText=makemultillelabel(真);
setboorder(BorderFactory.createEtchedBorder());
setFont(shortText.getFont().deriveFont(Font.BOLD));
shortText.setRows(2);
shortText.setColumns(20);
setText(短消息);
JTextArea messageText=makemultillelabel(true);
messageText.setboorder(BorderFactory.createtchedborder());
messageText.setFont(shortText.getFont().deriveFont(Font.PLAIN));
messageText.setRows(4);
messageText.setColumns(20);
messageText.setText(message);
JPanel buttonPanel=新的JPanel();
添加(新的JButton(“OK”));
添加(新的JButton(“取消”));
JPanel contentPanel=新的JPanel();
contentPanel.set不透明(true);
contentPanel.setBorder(BorderFactory.createEmptyByOrder(10,10,8,9));
setLayout(新的GridBagLayout());
gridc;
c=新的GridBagConstraints();
c、 gridx=0;
c、 gridy=0;
c、 锚点=GridBagConstraints.FIRST\u LINE\u START;
c、 网格高度=2;
添加(新的JLabel(图标),c);
c=新的GridBagConstraints();
c、 gridx=1;
c、 gridy=0;
c、 fill=GridBagConstraints.BOTH;
c、 权重y=1.0;
c、 权重x=1.0;
contentPanel.add(短文本,c);
c=新的GridBagConstraints();
c、 gridx=1;
c、 gridy=1;
c、 fill=GridBagConstraints.BOTH;
c、 权重y=1.0;
c、 权重x=1.0;
contentPanel.add(messageText,c);
如果(附件!=null){
c=新的GridBagConstraints();
c、 gridx=0;
c、 gridy=2;
c、 网格宽度=2;
c、 fill=GridBagConstraints.BOTH;
c、 权重y=1.0;
c、 权重x=1.0;
contentPanel.add(附件c);
}
c=新的GridBagConstraints();
c、 网格宽度=2;
c、 gridx=0;
c、 gridy=3;
contentPanel.add(buttonPanel,c);
setContentPane(contentPanel);
}
已执行的公共无效操作(操作事件evt){
String text=textField.getText();
textArea.append(文本+换行符);
textField.selectAll();
//确保新文本可见,即使有
//是文本区域中的一个选择。
textArea.setCaretPosition(textArea.getDocument().getLength());
}
/**
*创建GUI并显示它。为了线程安全,
*应该从
*事件调度线程。
*/
私有静态void createAndShowGUI(){
//创建并设置窗口。
JFrame=newJFrame(“TextDemo”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
试一试{
抛出新异常(“测试”);
}捕获(例外e){
TextDemo t=newtextdemo(框架,“你不会逃脱惩罚的!”,
“警惕!警惕!一个楔块螺母杆已被无偿移除!”+
“一个巧克力坚果棒…已被移除!未付款!警惕,警惕!”,
getStackTraceTextArea(e));
//显示窗口。
frame.pack();
frame.setLocation(SCREENCENTER.x-frame.getSize().width/2,
SCREENCENTER.y-frame.getSize().height/2);
frame.setVisible(true);
t、 setModal(真);
t、 包装();
t、 设置位置(getPos(t,t.getOwner());
t、 setVisible(真);
}
}
受保护的静态JComponent getStackTraceTextArea(可丢弃异常){
JTextArea textArea=新的JTextArea();
textArea.setEditable(false);
textArea.setLineWrap(false);
append(getTraceMessage(exception));
textArea.setCaretPosition(0);
JScrollPane scroll=新的JScrollPane(textArea);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HorizontalScrollBar\uAlways);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL\u SCROLLBAR\u ALWAYS);
scroll.setPreferredSize(新尺寸(50140));
返回滚动条;
}
私有静态最终字符串getTraceMessage(可丢弃异常){
StringBuilder out=新的StringBuilder((新的SimpleDataFormat(“yyyy/MM/dd HH:MM:ss”))
.format(new Date())+“:未处理的异常:\n”
+异常。toString()+“\n\nSta
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 0;
c.fill = GridBagConstraints.BOTH;
c.weighty = 1.0;
c.weightx = 1.0;
contentPanel.add(shortText, c);
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 1;
c.fill = GridBagConstraints.BOTH;
c.weighty = 1.0;
c.weightx = 1.0;
contentPanel.add(messageText, c);
shortText.setRows(2); // for example
import java.awt.EventQueue;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class OptionPaneTest {
public static void main(String[] args) {
new OptionPaneTest();
}
public OptionPaneTest() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
StringBuilder sb = new StringBuilder(128);
sb.append("<html><b><p align=center>You won't get away with this!</p></b><br>");
sb.append("Alert! Alert! A chocy nut bar has been removed without payment!");
sb.append("<br>A chocy nut bar... has been REMOVED! WITHOUT PAYMENT! Alert, alert!");
JOptionPane.showMessageDialog(null, sb.toString(), "Alert", JOptionPane.WARNING_MESSAGE);
}
});
}
}
frame.setLocationRelativeTo(null);
frame.setLocation(SCREENCENTER.x - frame.getSize().width / 2,
SCREENCENTER.y - frame.getSize().height / 2);
JTextArea shortText = makeMultiLineLabel(true);
shortText.setBorder(BorderFactory.createEtchedBorder());
shortText.setFont(shortText.getFont().deriveFont(Font.BOLD));
// FontMetrics fm = shortText.getFontMetrics(
// shortText.getFont());
// shortText.setPreferredSize(new Dimension(
// Math.min(fm.stringWidth(shortMessage), 300),
// fm.getHeight()));
shortText.setRows(2);
shortText.setColumns(20);
shortText.setText(shortMessage);
JTextArea messageText = makeMultiLineLabel(true);
messageText.setBorder(BorderFactory.createEtchedBorder());
messageText.setFont(shortText.getFont().deriveFont(Font.PLAIN));
// fm = messageText.getFontMetrics(
// messageText.getFont());
// messageText.setPreferredSize(new Dimension(
// Math.min(fm.stringWidth(message), 300),
// fm.getHeight()));
messageText.setRows(4);
messageText.setColumns(20);
messageText.setText(message);