gpt4 book ai didi

java - 自动滚动 JScrollPane 令人不安

转载 作者:行者123 更新时间:2023-12-01 05:18:56 24 4
gpt4 key购买 nike

我正在开发一个文本编辑器,主面板由3个JTextPane组成,侧面2个显示行数和常见语法错误,中间1个用于显示行数和常见语法错误主要版本。整个内容都打包在 JScrollPane 中。

当用户跳行(按 ENTER)时,会出现自动滚动问题,附加的 KeyListener 在两侧的 JTextPane 中添加新条目(数字和语法)该行的错误),作为 react ,文档底部的 JScrollPane 自动滚动,可能是为了显示插入到 JTextPane 两侧的新文本。

我通过在 KeyListener 中设置每个新行(由用户添加)的 JScrollBar 位置来部分解决该问题。例如,使用scrollRectToVisible,或者更好地通过在两侧JTextPane之一中选择文本的适当部分。

但是,最终的效果并不是那么好,每换一行垂直滚动条都会振动,我们可以通过按 ENTER 几秒钟轻松使应用程序崩溃。我一直在寻找包含 JScrollPane 类的许多方法的解决方案,并尝试 AdjustmentListener 但没有成功。你愿意帮助我吗?

PS:对不起我的英语。我是法国人,我们的论坛很糟糕。

最佳答案

SSCCE 是很大的灵感来源,因为这个运行良好(运行时看不到我的问题),看来我的方法确实有效,但在我的真实代码中没有在正确的监听器中运行。

不管怎么说,还是要谢谢你!有 SSCCE,它是一个简单的 JScrollPane,由一个用于编辑的中央 JTextPane 和一个用于行号的横向 JTextPane 组成。 placeScroll() 方法放置滚动条,以便当 paneLigne 尝试将其向下推时,主 JTextPane 中的插入符号位于中间(垂直)。

再见

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.BorderLayout;
import javax.swing.JScrollPane;

public class SSCCE extends JFrame {

private JTextPane paneLigne, main;
private String tempchain;

public SSCCE() {

this.setSize(500,500);
this.setTitle("S");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);

paneLigne = new JTextPane();
paneLigne.setEditable(false);

tempchain = "";
for(int j=1; j<40; j++)
tempchain+=" " + j + " \n";
paneLigne.setText(tempchain);


main = new JTextPane();
main.addKeyListener(new KeyListener() {

private int lastnline=0;
public void keyPressed(KeyEvent arg0) {

if(arg0.getKeyCode()==10) {

String tecste=main.getText();
int n=nbLignes(tecste);

if(n>38) {
if(lastnline<n) {
paneLigne.setText(paneLigne.getText()+" " + (n+1) + " \n");
} else {
this.retablirLignes(tecste);
}
} else {
paneLigne.setText(tempchain);
}

lastnline=n;
this.placeScroll();
}

}

@Override
public void keyReleased(KeyEvent arg0) { }

@Override
public void keyTyped(KeyEvent arg0) { }



private int nbLignes(String str) {
int ret=1;
for(int n=0, cpt=0; (n=str.indexOf('\n', cpt))!=-1; cpt=n+1)
ret++;
return ret;
}

public void retablirLignes(String stret) {

int n=this.nbLignes(stret);
String retoure="";

if(n>=40) {

for(int j=1; j<n+2; j++)
retoure+=" " + j + " \n";
paneLigne.setText(retoure);

}
lastnline=n;
}

public void placeScroll() {
// TODO Auto-generated method stub

if(paneLigne!=null) {

int n=this.nbLignesBuen(main.getText().substring(0, main.getCaretPosition()));
if(n!=-1) {
paneLigne.select(paneLigne.getText().indexOf(""+n), n+1);
} else {
paneLigne.select(0,1);
}

}

}

private int nbLignesBuen(String str) { //return the index of the last 20th line
int ret=0;
for(int n, cpt=0; (n=str.indexOf('\n', cpt))!=-1; cpt=n+1)
ret++;
if(ret>20)
ret-=20;
else
ret=-1;
return ret;
}


});

JPanel contentpane=new JPanel(new BorderLayout());
contentpane.add(paneLigne, BorderLayout.WEST);
contentpane.add(main, BorderLayout.CENTER);

this.setContentPane(new JScrollPane(contentpane));
this.setVisible(true);

}

public static void main(String[] args) {

SSCCE fen = new SSCCE();

}

}

关于java - 自动滚动 JScrollPane 令人不安,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10756414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com