java JTextPane设置问题

importjava.awt.EventQueue;importjavax.swing.JFrame;importjavax.swing.JButton;importja... 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");才会显示一个结果,其他不显示,加上这一行就直接什么都没了
展开
 我来答
雪飞潇潇
2018-01-20 · TA获得超过6275个赞
知道大有可为答主
回答量:1968
采纳率:91%
帮助的人:873万
展开全部

答:因为调用的是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();
}
}
});
}
}
yinfengnong
2018-01-20 · TA获得超过5619个赞
知道大有可为答主
回答量:2344
采纳率:89%
帮助的人:2299万
展开全部

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);

}
}
追问
哦谢谢,还没学到字符串这里,难怪不能找出问题,谢谢大神
追答
还有问题的话可以追问,如要可以的话,采纳下吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
网友了了了
2018-01-20 · TA获得超过944个赞
知道小有建树答主
回答量:1074
采纳率:33%
帮助的人:201万
展开全部
你好,请把你的截图发出来看一下
追问
我补充在问题里面了,麻烦看下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式