public class Gui extends JFrame{
JTextField tf_input;
JTextArea ta_output;
JScrollPane sp_taop;
private class klis implements KeyListener{
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
if (e.getKeyCode()==KeyEvent.VK_ENTER){
//System.out.println("enter"); //debug
if (!tf_input.getText().isEmpty()){
String input = tf_input.getText();
ta_output.setText(ta_output.getText()+input+'\n');
System.out.println(input); //debug
System.out.println("ok!"); //debug
sp_taop.validate();
tf_input.setText(null);
}
}
}
}
Gui(){
System.out.println("hello");
inti();
render();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void inti() {
setSize(800, 600);
//text field input
tf_input = new JTextField();
tf_input.setSize(550, 24);
tf_input.addKeyListener(new klis());
//text Area
ta_output = new JTextArea("hello World\n",30,60);
ta_output.setSize(ta_output.getPreferredSize());
ta_output.setLineWrap(true);
ta_output.setEditable(false);
sp_taop = new JScrollPane();
sp_taop.add(ta_output);
sp_taop.setSize(ta_output.getSize().width+20,ta_output.getSize().height);
sp_taop.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
}
private void render() {
Panel p = new Panel(null);
ta_output.setLocation(0, 0);
sp_taop.setLocation(10, 10);
tf_input.setLocation(10, (sp_taop.getSize().height+20));
ta_output.repaint();
//adding
p.add(sp_taop);
p.add(tf_input);
add(p);
}
}
我在vbox 4.3.4 lUbuntu上的java 1.7.0_25上运行它
问题是jscroll没有自行更新!我该怎么办? 我一直在谷歌搜索几个小时,我没有发现任何接近我正在寻找的东西。
顺便说一下,如果没有它,很难解释这个问题。
答案 0 :(得分:0)
请勿使用JScrollPane#add
,这不是滚动窗格的工作方式,而是尝试使用JScrollPane#setViewportView
不要将文本字段添加到另一个容器。组件只能有一个父组件,因此将其添加到第二个容器中会将其从第一个组件中删除。
旁注。我会避免使用KeyListener
,文本组件有能力消耗关键事件,这意味着您的监听器可能实际上没有得到通知。此外,如果它被调用,组件将处于变异操作的中间(它将尝试更新它的模型),这可能导致意外问题和可能的脏更新。
在这种情况下,我可能想要使用DocumentListener
,但您需要对其进行测试。
我也会避免使用null
布局。首先,您将无法在滚动窗格的上下文中影响文本字段的位置,因为滚动窗格使用它自己的布局管理器。
此外,操作系统,视频驱动程序和字体之间的差异使潜在的渲染输出无穷无尽。布局管理人员在处理这些情况时会采取猜测工作