java JTextPane设置问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java JTextPane设置问题相关的知识,希望对你有一定的参考价值。

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTextPane;

public class action
private JFrame frame;
public static void main(String[] args)
EventQueue.invokeLater(new Runnable()
public void run()
try
action window = new action();
window.frame.setVisible(true);
catch (Exception e)
e.printStackTrace();


);

public action()
initialize();

private void initialize()
frame = new JFrame();
frame.setBounds(100, 100, 450, 568);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);

JButton btnNewButton = new JButton("关闭");
btnNewButton.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent e)
System.exit(0);

);
btnNewButton.setBounds(354, 496, 67, 23);
frame.getContentPane().add(btnNewButton);
final JTextPane textPane = new JTextPane();
textPane.setBounds(10, 10, 414, 476);
frame.getContentPane().add(textPane);

JButton btnNewButton_1 = new JButton("计算");
btnNewButton_1.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent e)
for(int i=1;i<=9;i++)
for(int j=1;j<=i;j++)
textPane.setText(j+"*"+i+"="+i*j+"\t");

textPane.setText("\n");




);
btnNewButton_1.setBounds(283, 496, 61, 23);
frame.getContentPane().add(btnNewButton_1);




请问为什么框框内只显示一个结果,而不是全部打印出来,求解决方法!!!
删除了 public void actionPerformed(ActionEvent e) for(int i=1;i<=9;i++)for(int j=1;j<=i;j++)textPane.setText(j+"*"+i+"="+i*j+"\t");textPane.setText("\n"););
删除了 textPane.setText("\n");才会显示一个结果,其他不显示,加上这一行就直接什么都没了

答:因为调用的是setText()方法,该方法会覆盖掉之前的文字,显示最后一次设置的文字

如果是JTextArea组件, 会有append(String str)方法,可以追加文字

JTextArea jta= new JTextArea();
jta.setText("123");//设置文字
jta.append("字符串");//追加文字

如果是 JTextPane 组件, 那么可以通过先获取文字,然后再设置文字的方式,来实现

JTextPane textPane = new JTextPane();
textPane.setText(textPane.getText()+"新字符串");

所以,你的代码需要修改成下面这样

btnNewButton_1.addActionListener(new ActionListener() 
public void actionPerformed(ActionEvent e) 
for (int i = 1; i <= 9; i++) 
for (int j = 1; j <= i; j++) 
// 先读取之前的文字,然后追加上现在的文字
textPane.setText(textPane.getText()+j + "*" + i + "=" + i * j + "\\t");

// 先读取之前的文字,然后追加上现在的文字
textPane.setText(textPane.getText()+"\\n");



);

效果图

1: 如果你觉得不够美观, 你可以加宽你的窗口和JTextPane组件

2: 如果你觉得循环太多次 。都要setText() ,那么也可以使用字符串拼接好了,只设置一次就可以了。

3: JDK版本5以后已经优化了字符串的拼接速度。所以使用 + 链接字符串,或者使用StringBuffer然后append效果差不多。

4: 你的类名是action 是不推荐的, 因为类名推荐首字母大写,并且使用有意义的名词比较好,比如MyFrame等。

5: 代码从风格上来看,比较乱,应该是使用windowbuilder 自动生成的代码。 自己写,其实更简单,并且很整洁。

6:  这段代码采用的是绝对布局 setLayout(null); 这样的布局,在不同的操作系统以及不同的运行环境下,显示的效果会有差别,并且也不能很好的缩放窗口,不推荐使用。

完整的参考代码和注释如下:

下面的代码纯手打, 一般的窗口都可以参考下面的写法书写

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;


//本类继承自JFrame实现了ActionListener接口
public class MyFrame extends JFrame implements ActionListener 
//获取当前系统的换行符。因为不同系统可能是\\n \\n\\r 。。等多种情况
public static final String NEW_LINE = System.getProperty("line.separator");

//文字面板
JTextPane jtp;

// 构造器
public MyFrame() 
//窗口中间的文字面板
jtp = new JTextPane();
add(jtp, BorderLayout.CENTER);// 把文本面板放到中间
//窗口南面的按钮面板
JPanel jps = new JPanel();
JButton jbShow = new JButton("计算");
jbShow.addActionListener(this);// 给按钮添加响应
JButton jbClose = new JButton("关闭");
jbClose.addActionListener(this);// 给按钮添加响应
jps.add(jbShow);
jps.add(jbClose);
add(jps, BorderLayout.SOUTH);// 把按钮面板加入到窗口的南面

//窗口属性的设置
setTitle("乘法表");//窗口标题
setSize(680, 300);//窗口宽 高
setLocationRelativeTo(null);//窗口居中(屏幕中央)
setDefaultCloseOperation(EXIT_ON_CLOSE);//点击窗口右上角的按钮时结束程序


// ActionListener接口需要实现actionPerformed方法 。可以对多个按钮点击做出响应
@Override
public void actionPerformed(ActionEvent e) 
String cmd = e.getActionCommand();// 按钮命令
if (cmd.equals("关闭")) // 如果是关闭按钮被点击
System.exit(0);
 else if (cmd.equals("计算")) // 如果是计算按钮被点击
StringBuffer sb = new StringBuffer();//jdk5以后 的版本使用字符串的 +链接,效率也高
for (int i = 1; i <= 9; i++) 
for (int j = 1; j <= i; j++) 
sb.append(j + "*" + i + "=" + i * j + "\\t");

sb.append(NEW_LINE);

jtp.setText(sb.toString());



// main方法
public static void main(String[] args) 
EventQueue.invokeLater(new Runnable() 
public void run() 
try 
new MyFrame().setVisible(true);// 实例化窗口并可见
 catch (Exception e) 
e.printStackTrace();


);

参考技术A

setText 每次都会把上次的内容覆盖掉的,所以不能每次都用 setText。先计算好,把结果放进一个字符串缓冲区中,最后一次setText() 。

运行结果:

修改后的代码如下:


import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTextPane;

public class action 
private JFrame frame;

public static void main(String[] args) 
EventQueue.invokeLater(new Runnable() 
public void run() 
try 
action window = new action();
window.frame.setVisible(true);
 catch (Exception e) 
e.printStackTrace();


);


public action() 
initialize();


private void initialize() 
frame = new JFrame();
frame.setBounds(100, 100, 700, 568);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);

JButton btnNewButton = new JButton("关闭");
btnNewButton.addActionListener(new ActionListener() 
public void actionPerformed(ActionEvent e) 
System.exit(0);

);
btnNewButton.setBounds(354, 496, 67, 23);
frame.getContentPane().add(btnNewButton);
final JTextPane textPane = new JTextPane();
textPane.setBounds(10, 10, 680, 476);
frame.getContentPane().add(textPane);

JButton btnNewButton_1 = new JButton("计算");
btnNewButton_1.addActionListener(new ActionListener() 
public void actionPerformed(ActionEvent e) 

StringBuffer buffer = new StringBuffer();

for (int i = 1; i <= 9; i++) 
for (int j = 1; j <= i; j++) 

buffer.append(j + "*" + i + "=" + i * j + "\\t");


buffer.append("\\n");


textPane.setText(buffer.toString());


);
btnNewButton_1.setBounds(283, 496, 61, 23);
frame.getContentPane().add(btnNewButton_1);


追问

哦谢谢,还没学到字符串这里,难怪不能找出问题,谢谢大神

追答

还有问题的话可以追问,如要可以的话,采纳下吧。

参考技术B 你好,请把你的截图发出来看一下追问

我补充在问题里面了,麻烦看下

以上是关于java JTextPane设置问题的主要内容,如果未能解决你的问题,请参考以下文章

Java - 如何获取 JTextPane 的默认字体大小

java的字体的颜色,型号,大小的方法

如何使用 Java 代码查看 JTextPane 中的段落符号?

将 JTextPane 设置为内容类型 HTML 并使用字符串构建器

如何在 JTextPane 中的一行上设置自定义背景颜色

如何在 JTextPane 中为文本和下划线设置不同的颜色?