我是Java的新手,最近开始开发一个简单的应用程序。目前,我在使用JScrollPanne时遇到问题,当textarea中的文本超过区域大小时,它无法向下(或向上)滚动。我已经看过一些解决方案,但所有解决方案都是针对FlowLayot(GridLayout和BoxLayout),而不是GroupLayout。这是代码:
JPanel conent_p = new JPanel();
conent_p.setBorder(new TitledBorder(null, "", TitledBorder.LEADING, TitledBorder.TOP, null, null));
JLabel lblItemName = new JLabel("Item name:");
itemField = new JTextField();
itemField.setColumns(10);
JLabel lblMxPrice = new JLabel("Max price:");
mpriceField = new JTextField();
mpriceField.setColumns(10);
JLabel lblQuantity = new JLabel("Quantity:");
quanField = new JTextField();
quanField.setColumns(10);
JLabel lblDelivery = new JLabel("Delivery:");
delivField = new JTextField();
delivField.setColumns(10);
JLabel lblLogcat = new JLabel("LogCat:");
final JTextArea txtConsole = new JTextArea();
txtConsole.setEditable(false);
txtConsole.setLineWrap(true);
txtConsole.setWrapStyleWord(true);
sbrText = new JScrollPane(txtConsole);
sbrText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
// Now create a new TextAreaOutputStream to write to our JTextArea control and wrap a
// PrintStream around it to support the println/printf methods.
PrintStream out = new PrintStream(new TextAreaOutputStream(txtConsole));
// redirect standard output stream to the TextAreaOutputStream
System.setOut(out);
// redirect standard error stream to the TextAreaOutputStream
System.setErr(out);
GroupLayout gl_conent_p = new GroupLayout(conent_p);
gl_conent_p.setHorizontalGroup(
gl_conent_p.createParallelGroup(Alignment.LEADING)
.addGroup(gl_conent_p.createSequentialGroup()
.addContainerGap()
.addGroup(gl_conent_p.createParallelGroup(Alignment.LEADING)
.addComponent(lblMxPrice, Alignment.TRAILING)
.addComponent(lblItemName, Alignment.TRAILING)
.addComponent(lblLogcat, Alignment.TRAILING))
.addGap(18)
.addGroup(gl_conent_p.createParallelGroup(Alignment.LEADING)
.addGroup(gl_conent_p.createSequentialGroup()
.addGroup(gl_conent_p.createParallelGroup(Alignment.LEADING, false)
.addComponent(itemField, GroupLayout.PREFERRED_SIZE, 365, GroupLayout.PREFERRED_SIZE)
.addGroup(gl_conent_p.createSequentialGroup()
.addComponent(mpriceField, GroupLayout.PREFERRED_SIZE, 80, GroupLayout.PREFERRED_SIZE)
.addGap(18)
.addComponent(lblQuantity)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(quanField, 0, 0, Short.MAX_VALUE)
.addGap(18)
.addComponent(lblDelivery)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(delivField, GroupLayout.PREFERRED_SIZE, 80, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.RELATED)))
.addGap(100))
.addGroup(gl_conent_p.createSequentialGroup()
.addComponent(txtConsole, GroupLayout.PREFERRED_SIZE, 345, GroupLayout.PREFERRED_SIZE)
.addComponent(sbrText)
.addContainerGap())))
);
gl_conent_p.setVerticalGroup(
gl_conent_p.createParallelGroup(Alignment.LEADING)
.addGroup(gl_conent_p.createSequentialGroup()
.addContainerGap()
.addGroup(gl_conent_p.createParallelGroup(Alignment.BASELINE)
.addComponent(lblItemName)
.addComponent(itemField, GroupLayout.PREFERRED_SIZE, 20, GroupLayout.PREFERRED_SIZE))
.addGap(20)
.addGroup(gl_conent_p.createParallelGroup(Alignment.LEADING)
.addGroup(gl_conent_p.createParallelGroup(Alignment.BASELINE)
.addComponent(lblDelivery)
.addComponent(delivField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addGroup(gl_conent_p.createParallelGroup(Alignment.BASELINE)
.addComponent(lblMxPrice)
.addComponent(mpriceField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(lblQuantity)
.addComponent(quanField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))
.addGap(55)
.addGroup(gl_conent_p.createParallelGroup(Alignment.BASELINE)
.addComponent(lblLogcat)
.addComponent(txtConsole, GroupLayout.PREFERRED_SIZE, 200, GroupLayout.PREFERRED_SIZE)
.addComponent(sbrText))
.addContainerGap())
);
conent_p.setLayout(gl_conent_p);
getContentPane().add(conent_p, BorderLayout.NORTH);
JButton btnBuy = new JButton("Buy");
btnBuy.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent ev) {
try {
String title = itemField.getText().trim();
String mprice = mpriceField.getText().trim();
String quantity = quanField.getText().trim();
String deliver = delivField.getText().trim();
Item_CONCEPT item = new Item_CONCEPT();
item.setName(title);
item.setDelivery(Integer.parseInt(deliver));
item.setStartPrice(0);
item.setMaxPrice(Integer.parseInt(mprice));
myAgent.existsSeller(item);
Date date = new Date();
DateFormat df = new SimpleDateFormat("dd.MM.yy HH:mm");
System.out.println(df.format(date)+": Buyer orders an item: "+item.getName());
//Clearing all fields
itemField.setText("");
quanField.setText("");
delivField.setText("");
//txtConsole.setText("");
mpriceField.setText("");
}
catch (Exception e) {
JOptionPane.showMessageDialog(BuyerGUI.this, "A field is filled incorrectly. "+e.getMessage()+" is invalid.", "Error", JOptionPane.ERROR_MESSAGE);
}
}
} );![enter image description here][1]
最佳答案
您观察到的问题来自两个事实:
您正在将内容面板添加到BorderLayout.NORTH
您将文本控制台以及滚动窗格添加为单独的组件
对于第一个:替换
getContentPane().add(conent_p, BorderLayout.NORTH);
与
getContentPane().add(conent_p, BorderLayout.CENTER);
第二点:请勿单独添加
txtConsole
,即在水平组替代中
.addGroup(gl_conent_p.createSequentialGroup()
.addComponent(txtConsole, GroupLayout.PREFERRED_SIZE, 345, GroupLayout.PREFERRED_SIZE)
.addComponent(sbrText).addContainerGap());
与
.addComponent(sbrText);
在垂直群体内
.addGroup(gl_conent_p.createParallelGroup(Alignment.BASELINE)
.addComponent(lblLogcat)
.addComponent(txtConsole, GroupLayout.PREFERRED_SIZE, 200, GroupLayout.PREFERRED_SIZE)
.addComponent(sbrText)).addContainerGap()));
与
.addGroup(gl_conent_p.createParallelGroup(Alignment.BASELINE)
.addComponent(lblLogcat)
.addComponent(sbrText)).addContainerGap()));
关于java - GroupLayout:TextArea中的JScrollPane无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11284587/