Java 我的jscorllpane不';行不通
我正在VBOX4.3.4Lubuntu上运行Java1.7.025 问题是jscroll没有自我更新!我该怎么办? 我已经在谷歌上搜索了几个小时了,但我没有找到任何和我要找的内容相近的东西Java 我的jscorllpane不';行不通,java,jscrollpane,Java,Jscrollpane,我正在VBOX4.3.4Lubuntu上运行Java1.7.025 问题是jscroll没有自我更新!我该怎么办? 我已经在谷歌上搜索了几个小时了,但我没有找到任何和我要找的内容相近的东西 顺便说一句,对于普通代码很抱歉,没有它很难解释问题。不要使用JScrollPane#add,这不是滚动窗格的工作方式,请尝试使用 看看 不要将文本字段添加到其他容器中。组件只能有一个父组件,因此将其添加到第二个容器将从第一个容器中删除它 旁注。我会避免使用KeyListener,因为文本组件具有使用关键事件的
顺便说一句,对于普通代码很抱歉,没有它很难解释问题。不要使用
JScrollPane#add
,这不是滚动窗格的工作方式,请尝试使用
看看
不要将文本字段添加到其他容器中。组件只能有一个父组件,因此将其添加到第二个容器将从第一个容器中删除它
旁注。我会避免使用KeyListener
,因为文本组件具有使用关键事件的能力,这意味着您的侦听器实际上可能不会收到通知。此外,如果调用它,组件将处于突变操作的中间(它将尝试更新它的模型),这可能导致意想不到的问题和可能的脏更新。
在这种情况下,我可能会尝试使用DocumentListener
,但您需要对其进行测试
我还将避免使用null
布局。首先,您将无法在滚动窗格的上下文中影响文本字段的位置,因为滚动窗格使用它自己的布局管理器
此外,操作系统、视频驱动程序和字体之间的差异使得潜在的渲染输出无穷无尽。布局管理员在处理这些情况时会进行猜测工作
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);
}
}