java JTextPane设置问题
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();
}
}
});
}
}
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);
}
}
哦谢谢,还没学到字符串这里,难怪不能找出问题,谢谢大神
还有问题的话可以追问,如要可以的话,采纳下吧。
我补充在问题里面了,麻烦看下