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()+"新字符串");
所以,你的代码需要修改成下面这样
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 中的段落符号?