- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在突出显示 jtextpane java swing 中的特定行时遇到问题。我有一个名为 Solution 的主类和我在网上找到的 Modified LinePainter。每当调用 sl() 函数时,它都会绘制特定的线。这是由于调用了paint方法。我用 paint 方法打印了虚拟线。该虚拟线经常打印。这意味着在预定义的时间段后调用绘制方法。运行代码后,我发现每当我最大化或最小化窗口时,只有它显示正确的所需行突出显示。我希望每当我调用 sl 函数时(sl 意味着设置行意味着突出显示通过的行号)。应该改变或者学习什么?感谢您的阅读。
Solution.java 文件
import javax.swing.*;
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
JFrame f = new JFrame("Swing Paint Demo");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextPane jTextPane=new JTextPane();
jTextPane.setText("abc\nbcd\nmm\njjjjj");
LinePainter linePainter=new LinePainter(jTextPane);
Scanner sc=new Scanner(System.in);
f.add(jTextPane);
f.setSize(250,250);
f.setVisible(true);
int x=sc.nextInt();
linePainter.sl(2);
x=sc.nextInt();
linePainter.sl(3);
}
}
LinePainter.java 文件
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
/*
* Track the movement of the Caret by painting a background line at the
* current caret position.
*/
public class LinePainter
implements Highlighter.HighlightPainter, CaretListener, MouseListener, MouseMotionListener
{
private JTextComponent component;
private Color color;
private Rectangle lastView;
/*
* The line color will be calculated automatically by attempting
* to make the current selection lighter by a factor of 1.2.
*
* @param component text component that requires background line painting
*/
public LinePainter(JTextComponent component)
{
this(component, null);
setLighter(component.getSelectionColor());
}
/*
* Manually control the line color
*
* @param component text component that requires background line painting
* @param color the color of the background line
*/
public LinePainter(JTextComponent component, Color color)
{
this.component = component;
setColor( color );
// Add listeners so we know when to change highlighting
component.addCaretListener( this );
component.addMouseListener( this );
component.addMouseMotionListener( this );
// Turn highlighting on by adding a dummy highlight
try
{
component.getHighlighter().addHighlight(0, 0, this);
}
catch(BadLocationException ble) {}
}
/*
* You can reset the line color at any time
*
* @param color the color of the background line
*/
public void setColor(Color color)
{
this.color = color;
}
/*
* Calculate the line color by making the selection color lighter
*
* @return the color of the background line
*/
public void setLighter(Color color)
{
int red = Math.min(255, (int)(color.getRed() * 1.2));
int green = Math.min(255, (int)(color.getGreen() * 1.2));
int blue = Math.min(255, (int)(color.getBlue() * 1.2));
setColor(new Color(red, green, blue));
}
public int ln=1;
public void sl(int l) { ln=l;
System.out.println("hii"); }
// Paint the background highlight
public void paint(Graphics g, int p0, int p1, Shape bounds, JTextComponent c)
{
try
{
System.out.println("calling paint");
// resetHighlight();
Rectangle r = c.modelToView((c).getDocument().getDefaultRootElement().getElement(ln-1).getStartOffset());
g.setColor( color );
// if(lastView != null){
// g.clearRect(0,lastView.y,c.getWidth(),lastView.height);
// }
g.fillRect(0, r.y, c.getWidth(), r.height);
// if (lastView == null)
// lastView = r;
}
catch(BadLocationException ble) {System.out.println(ble);}
}
/*
* Caret position has changed, remove the highlight
*/
private void resetHighlight()
{
System.out.println("reset");
// Use invokeLater to make sure updates to the Document are completed,
// otherwise Undo processing causes the modelToView method to loop.
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
try
{
Rectangle currentView = component.modelToView(component.getDocument().getDefaultRootElement().getElement(ln-1).getStartOffset());;
// Remove the highlighting from the previously highlighted line
if (lastView.y != currentView.y)
{
component.repaint(0, lastView.y, component.getWidth(), lastView.height);
lastView = currentView;
}
}
catch(BadLocationException ble) {}
}
});
}
// Implement CaretListener
public void caretUpdate(CaretEvent e)
{
// resetHighlight();
}
// Implement MouseListener
public void mousePressed(MouseEvent e)
{
// resetHighlight();
}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
// Implement MouseMotionListener
public void mouseDragged(MouseEvent e)
{
// resetHighlight();
}
public void mouseMoved(MouseEvent e) {}
}
更新:
我更新了我的 LinePainter 文件,如下所示。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
/*
* Track the movement of the Caret by painting a background line at the
* current caret position.
*/
public class LinePainter
implements Highlighter.HighlightPainter, CaretListener, MouseListener, MouseMotionListener
{
private JTextComponent component;
private Color color;
private Rectangle lastView;
/*
* The line color will be calculated automatically by attempting
* to make the current selection lighter by a factor of 1.2.
*
* @param component text component that requires background line painting
*/
public LinePainter(JTextComponent component)
{
this(component, null);
setLighter(component.getSelectionColor());
}
/*
* Manually control the line color
*
* @param component text component that requires background line painting
* @param color the color of the background line
*/
public LinePainter(JTextComponent component, Color color)
{
this.component = component;
setColor( color );
// Add listeners so we know when to change highlighting
component.addCaretListener( this );
component.addMouseListener( this );
component.addMouseMotionListener( this );
// Turn highlighting on by adding a dummy highlight
try
{
component.getHighlighter().addHighlight(0, 0, this);
}
catch(BadLocationException ble) {}
}
/*
* You can reset the line color at any time
*
* @param color the color of the background line
*/
public void setColor(Color color)
{
this.color = color;
}
/*
* Calculate the line color by making the selection color lighter
*
* @return the color of the background line
*/
public void setLighter(Color color)
{
int red = Math.min(255, (int)(color.getRed() * 1.2));
int green = Math.min(255, (int)(color.getGreen() * 1.2));
int blue = Math.min(255, (int)(color.getBlue() * 1.2));
setColor(new Color(red, green, blue));
}
public int ln=1,prev=1;
public void sl(int l) { prev=ln; ln=l;
System.out.println("hii");
//resetHighlight();
}
// Paint the background highlight
public void paint(Graphics g, int p0, int p1, Shape bounds, JTextComponent c)
{
try
{
// System.out.println("calling paint");
// resetHighlight();
if(prev != ln){
Rectangle rect=c.modelToView((c).getDocument().getDefaultRootElement().getElement(prev-1).getStartOffset());
prev=ln;
System.out.println(rect.y+" " +c.getWidth()+" "+rect.height);
g.clearRect(0,rect.y,c.getWidth(),rect.height);
}
Rectangle r = c.modelToView((c).getDocument().getDefaultRootElement().getElement(ln-1).getStartOffset());
g.setColor( color );
// if(lastView != null){
// g.clearRect(0,lastView.y,c.getWidth(),lastView.height);
// }
System.out.println(r.y+" " +c.getWidth()+" "+r.height);
g.fillRect(0, r.y, c.getWidth(), r.height);
if (lastView == null)
lastView = r;
}
catch(BadLocationException ble) {System.out.println(ble);}
}
/*
* Caret position has changed, remove the highlight
*/
private void resetHighlight()
{
System.out.println("reset");
// Use invokeLater to make sure updates to the Document are completed,
// otherwise Undo processing causes the modelToView method to loop.
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
try
{
System.out.println("prev line "+prev+" "+ln);
Rectangle currentView = component.modelToView(component.getDocument().getDefaultRootElement().getElement(prev-1).getStartOffset());
// Remove the highlighting from the previously highlighted line
if (lastView.y != currentView.y)
{
component.repaint(0, lastView.y, component.getWidth(), lastView.height);
lastView = currentView;
}
prev=ln;
}
catch(BadLocationException ble) {}
}
});
}
// Implement CaretListener
public void caretUpdate(CaretEvent e)
{
// resetHighlight();
}
// Implement MouseListener
public void mousePressed(MouseEvent e)
{
// resetHighlight();
}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
// Implement MouseMotionListener
public void mouseDragged(MouseEvent e)
{
// resetHighlight();
}
public void mouseMoved(MouseEvent e) {}
}
我仍然没有得到我想要的输出。 sl() 调用后突出显示不会更新。如果有任何建议请告诉我。谢谢......
最佳答案
看起来您从 Line Painter 获取了代码.
该代码的关键是 resetHighlight()
方法。每次更改插入符位置时都会调用该方法,因此可以在新行处绘制突出显示。
您已注释掉对该方法的所有调用。
所以我认为你需要做两件事:
您需要修改resetHighlight()方法,根据行号而不是插入符位置来计算要重绘的矩形。
linePainter.sl(2);
x=sc.nextInt();
linePainter.sl(3);
不确定该代码的意义是什么。 LinePainter 一次只会绘制一行,因此调用该方法两次将导致第三行突出显示。
关于java - 在 JTextPane java swing 中填充行的矩形后无法与 View 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51013983/
我正在实现 IMAP 客户端,但 IMAP 邮箱同步出现问题。 首先,可以从 IMAP 服务器获取新邮件,但我不知道如何从邮箱中查找已删除的邮件。 我是否应该从服务器获取所有消息并将其与本地数据进行比
我研究线程同步。当我有这个例子时: class A { public synchronized void methodA(){ } public synchronized void met
嗨,我做了一个扩展线程的东西,它添加了一个包含 IP 的对象。然后我创建了该线程的两个实例并启动它们。他们使用相同的列表。 我现在想使用 Synchronized 来阻止并发更新问题。但它不起作用,我
我正在尝试使用 FTP 定期将小数据文件从程序上传到服务器。用户从使用 javascript XMLHttpRequest 函数读取数据的网页访问数据。这一切似乎都有效,但我正在努力解决由 FTP 和
我不知道如何同步下一个代码: javascript: (function() { var s2 = document.createElement('script'); s2.src =
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
一 点睛 1 Message 在基于 Message 的系统中,每一个 Event 也可以被称为 Message,Message 是对 Event 更高一个层级的抽象,每一个 Message 都有一个
一 点睛 1 Message 在基于 Message 的系统中,每一个 Event 也可以被称为 Message,Message 是对 Event 更高一个层级的抽象,每一个 Message 都有一个
目标:我所追求的是每次在数据库中添加某些内容时(在 $.ajax 到 Submit_to_db.php 之后),从数据库获取数据并刷新 main.php(通过 draw_polygon 更明显)。 所
我有一个重复动画,需要与其他一些 transient 动画同步。重复动画是一条在屏幕上移动 4 秒的扫描线。当它经过下面的图像时,这些图像需要“闪烁”。 闪烁的图像可以根据用户的意愿来来去去和移动。它
我有 b 个块,每个块有 t 个线程。 我可以用 __syncthreads() 同步特定块中的线程。例如 __global__ void aFunction() { for(i=0;i #
我正在使用azure表查询来检索分配给用户的所有错误实体。 此外,我更改了实体的属性以声明该实体处于处理模式。 处理完实体后,我将从表中删除该实体。 当我进行并行测试时,可能会发生查询期间,一个实体已
我想知道 SQLite 是如何实现它的。它基于文件锁定吗?当然,并不是每个访问它的用户都锁定了整个数据库;那效率极低。它是基于多个文件还是仅基于一个大文件? 如果有人能够简要概述一下 sqlite 中
我想post到php,当id EmpAgree1时,然后它的post变量EmpAgree=1;当id为EmpAgree2时,则后置变量EmpAgree=2等。但只是读取i的最后一个值,为什么?以及如何
CUBLAS 文档提到我们在读取标量结果之前需要同步: “此外,少数返回标量结果的函数,例如 amax()、amin、asum()、rotg()、rotmg()、dot() 和 nrm2(),通过引用
我知道下面的代码中缺少一些内容,我的问题是关于 RemoteImplementation 中的同步机制。我还了解到该网站和其他网站上有几个关于 RMI 和同步的问题;我在这里寻找明确的确认/矛盾。 我
我不太确定如何解决这个问题......所以我可能需要几次尝试才能正确回答这个问题。我有一个用于缓存方法结果的注释。我的代码目前是一个私有(private)分支,但我正在处理的部分从这里开始: http
我对 Java 非常失望,因为它不允许以下代码尽可能地并发移动。当没有同步时,两个线程会更频繁地切换,但是当尝试访问同步方法时,在第二个线程获得锁之前以及在第一个线程获得锁之前再次花费太长时间(比如
过去几周我一直在研究java多线程。我了解了synchronized,并理解synchronized避免了多个线程同时访问相同的属性。我编写此代码是为了在同一线程中运行两个线程。 val gate =
我有一个关于 Java 同步的简单问题。 请假设以下代码: public class Test { private String address; private int age;
我是一名优秀的程序员,十分优秀!