jtable问题

allen110119 2008-04-08 01:18:47
当jtable中某列中的单元格的数据过长不能完全显示,我想实现这样的功能:在这个单元格上单击右键后,弹出文本框(或菜单)将其内容完整显示,如何实现?
...全文
307 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
mxx123 2008-04-11
  • 打赏
  • 举报
回复
继续关注,继续支持,
allen110119 2008-04-11
  • 打赏
  • 举报
回复
唉,高人怎么还不出现啊
allen110119 2008-04-11
  • 打赏
  • 举报
回复
谢谢各位大侠的帮助,问题按32楼和33楼的方法已经解决了。谢谢,32楼y_muzi 朋友和33楼marcien 朋友的代码,你们的方法都是我想要的,其中y_muzi朋友的代码中在mouseReleased()中加一句area.setLineWrap(true);就完美了。
谢谢name99_6 朋友的建议,谢谢大家的关注!
marcien 2008-04-11
  • 打赏
  • 举报
回复
这个问题还在纠结啊~

楼上name99_6 说的方法挺好的。想让ToolTip换行也行的,看看下面的代码,
唯一的美中不足是:缓行是根据词来换行的(比较常用,英文单词不会被切断),Cell[1, 4]超长的连续英文字符就没法换行了,其它的都可以的。


import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.FontMetrics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;

public class CellToolTipTable extends JFrame
{
private static final long serialVersionUID = 2462831262086443689L;

private static Object[][] data = new String[][] {
{ "01234567890123456789", "abcdefgh igklmnopq rstuvwxyz" },
{ "01234567890123456789012345678901234567890123456789",
"abcd efghi gklm nopq rstu vwx yz abcd efgh igkl mno pqr stu vwx yz" },
{ "00000000 00000000 00000 000000000 00000000 000000000 0000000000000000000000 000000000000000000000000",
"ABCDEFG HIGKLMNO PQRSTUV WXYZAB CDEFGH IGKLMNOPQRSTUV WXYZABCDEFGHIGKLMN OPQRSTUVWXYZ" },
{ "就算天空再深 看不出裂痕 眉头仍聚满密云 就算一屋暗灯 照不穿我身 仍可反映你心 让这口烟跳升 我身躯下沉 曾多么想多么想贴近 你的心和眼 口和耳亦没缘份 我都捉不紧",
"#就算天空再深看不出裂痕眉头仍聚满密云AAAAAAAAAAAAAAAAAAAAAAA就算一屋暗灯照不穿我身仍可反映你心aaaaaaaaaaaaaaaaaaaa0000000000000000000#" },
{ "就算天空再深看不出裂痕眉头仍聚满密云就算一屋暗灯照不穿我身仍可反映你心让这口烟跳升我身躯下沉曾多么想多么想贴近你的心和眼口和耳亦没缘份我都捉不紧",
"#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA#" } };
private static Object[] columnNames = new String[] { "T0", "T1" };

private JScrollPane scrollPane = new JScrollPane();
private DefaultTableModel model = new DefaultTableModel(data, columnNames);
private JTable table = new JTable(model);

private JPanel buttonPane = new JPanel();
private JButton okButton = new JButton("OK");

private static final int MAX_TOOLTIP_WIDTH = 400;

public CellToolTipTable()
{
table.addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseMoved(MouseEvent e)
{
int row = table.rowAtPoint(e.getPoint());
int column = table.columnAtPoint(e.getPoint());

Object value = table.getValueAt(row, column);
if ((value != null) && (value.toString().length() != 0))
{
int columnWidth = table.getColumnModel().getColumn(column).getWidth();
FontMetrics fm = table.getFontMetrics(table.getFont());
String valueString = value.toString();
int valueStringWidth = fm.stringWidth(valueString);
System.out.println("valueStringWidth = " + valueStringWidth);
if (valueStringWidth + 3 >= columnWidth)
{
if (valueStringWidth > MAX_TOOLTIP_WIDTH)
{
StringBuffer sb = new StringBuffer();
sb.append("<HTML><BODY><DIV width=");
sb.append(MAX_TOOLTIP_WIDTH);
sb.append(">");
sb.append(valueString);
sb.append("</DIV></BODY></HTML>");

table.setToolTipText(sb.toString());
}
else
{
table.setToolTipText(valueString);
}
}
else
{
table.setToolTipText(null);
}
}
else
{
table.setToolTipText(null);
}
}
});

scrollPane.getViewport().add(table);

okButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});

buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
buttonPane.add(okButton);

getContentPane().setLayout(new BorderLayout());
getContentPane().add(scrollPane, BorderLayout.CENTER);
getContentPane().add(buttonPane, BorderLayout.SOUTH);
}

public static void main(String[] args)
{
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (Exception ex)
{
ex.printStackTrace();
}

JFrame.setDefaultLookAndFeelDecorated(true);

CellToolTipTable frame = new CellToolTipTable();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.setLocation(200, 200);
frame.setVisible(true);
}
}
y_muzi 2008-04-11
  • 打赏
  • 举报
回复

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

public class TestDlg
extends JDialog implements MouseMotionListener,MouseListener {
private int nowRow=-1;
private int nowColumn=-1;

public TestDlg() {
try {
jbInit();
}
catch (Exception ex) {
ex.printStackTrace();
}
}

public static void main(String args[]) {
TestDlg dlg = new TestDlg();
dlg.setSize(600, 480);
dlg.setLocationRelativeTo(null);
dlg.setVisible(true);
}

private void jbInit() throws Exception {
this.getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);
jScrollPane1.getViewport().add(tab);
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 3; j++) {
tab.setValueAt(tab.getColumnName(j) + (i + 1), i, j);
}
}
tab.addMouseListener(this);
tab.addMouseMotionListener(this);
dlg.setSize(200,200);
dlg.add(area);
}
JScrollPane jScrollPane1 = new JScrollPane();
JTable tab = new JTable(6, 3);
JDialog dlg=new JDialog(this);

JTextArea area=new JTextArea();
public void mouseDragged(MouseEvent e) {
}

public void mouseMoved(MouseEvent e) {
if(tab!=null){

int newRow=tab.rowAtPoint(e.getPoint());
int newColum=tab.columnAtPoint(e.getPoint());
if (newRow != nowRow||newColum!=nowColumn) {
if(dlg.isVisible()){
tab.setValueAt(area.getText(),nowRow,nowColumn);
}
nowColumn=newColum;
nowRow=newRow;
dlg.setVisible(false);
}
}
}

public void mouseClicked(MouseEvent e) {

}

public void mousePressed(MouseEvent e) {
}

public void mouseReleased(MouseEvent e) {
if (e.getButton() == 3) {
Object ob = tab.getValueAt(nowRow, nowColumn);
area.setText(ob.toString());
dlg.setLocationRelativeTo(this);
Point p = e.getPoint();
Point p2 = tab.getLocationOnScreen();
p.setLocation(p.getX() + p2.getX(), p.getY() + p2.getY());
dlg.setLocation(p);
dlg.setVisible(true);
}
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}

}

不知是不是 LZ要
allen110119 2008-04-10
  • 打赏
  • 举报
回复
不是吧。。。。。。。。。。
allen110119 2008-04-10
  • 打赏
  • 举报
回复
难道这个问题无解吗?
allen110119 2008-04-10
  • 打赏
  • 举报
回复
因为我单元格中的数据是从数据库中提取的,有某一列中某些单元格中的数据可能会很长,如果用JTextArea来渲染单元格的话,虽然能解决自动换行的问题,但是这样就会使数据过长的单元格显得很突兀,影响整个表的美观
所以,我就像能在右键单击某个单元格时,能在这个单元格附近弹出一个像右键快捷菜单这样大小功能的东西(JTextArea?)来自动换行显示其中的数据
allen110119 2008-04-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 assdust110 的回复:]
JOptionPane.showMessageDialog(),把你要显示的东西传递到里面就可以了,还要一些参数,具体不记得了,你可以去看下API
[/Quote]

JOptionPane.showMessageDialog()也是无法自动换行的,而且每单击一次就出来一个对话框很烦吧?
allen110119 2008-04-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 name99_6 的回复:]
楼主参照以下代码,实现tooltip功能.覆盖JTable中的prepareRenderer方法...


Java codepublic Component prepareRenderer(TableCellRenderer renderer,
int rowIndex, int vColIndex) {
c = super.prepareRenderer(renderer, rowIndex, vColIndex);
if (c instanceof JComponent) {
jc = (JComponent) c;
Object cellValues = this.getValueAt(rowIndex, vColInde…
[/Quote]
13楼的,你这个虽然是单元格实现了tooltip,但是,可能你理解错我的意思了
我这里最重要的是想自动换行,你这个还是没法换行啊,右键单击单元格时出来一行那么长的tooltip。。。。。
helanpiaoxue 2008-04-10
  • 打赏
  • 举报
回复
关注
allen110119 2008-04-10
  • 打赏
  • 举报
回复
LS的你贴这点代码来干吗啊,什么问题都没解决嘛
assdust110 2008-04-10
  • 打赏
  • 举报
回复
JOptionPane.showMessageDialog(),把你要显示的东西传递到里面就可以了,还要一些参数,具体不记得了,你可以去看下API
East271536394 2008-04-10
  • 打赏
  • 举报
回复
package mypro;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import java.awt.*;
import javax.swing.UIManager;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.event.*;
import java.awt.event.*;
import javax.swing.table.JTableHeader;
import java.awt.Rectangle;
import javax.swing.*;

/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2008</p>
*
* <p>Company: </p>
*
* @author张栋芳QQ271536394
* @version 1.0人事综合
*/

vCol.add("员工编号");
vCol.add("姓名");
vCol.add("部门");
vCol.add("职位");
vCol.add("调入日期");
vCol.add("调出日期");
vCol.add("备注信息");
vRows=sql_Move.selAll();
getDate(vRows);
contentPane = (JPanel) getContentPane();
contentPane.setLayout(null);
setSize(new Dimension(700, 465));
//this.setResizable(false);
setTitle("人事综合管理");
jTabbedPane1.setBackground(UIManager.getColor("CheckBox.background"));
jTabbedPane1.setFont(new java.awt.Font("Dialog", Font.BOLD, 14));
jTabbedPane1.setForeground(Color.green);
jTabbedPane1.setBorder(null);
jTabbedPane1.setBounds(new Rectangle( -3, 70, 698, 363));
jPanel1.setBorder(BorderFactory.createLineBorder(Color.black));
jPanel1.setLayout(null);
labShowCount.setFont(new java.awt.Font("Dialog", Font.BOLD, 13));
labShowCount.setForeground(Color.red);
labShowCount.setBounds(new Rectangle(569, 303, 102, 20));
jScrollPane.setBounds(new Rectangle(2, 95, 682, 183));
jPanel1.add(labShowCount);
jPanel1.add(jScrollPane);
jTable1.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
jTable1.getSelectedColumn();//哪一列
int index=jTable1.getSelectedRow();//哪一行
voTable=(Vector)vRows.get(index);
if (e.getClickCount()==2){ //双击表格
}
}
});
}
allen110119 2008-04-10
  • 打赏
  • 举报
回复
25楼的朋友,能给点代码示例吗?最好能详细的点的,我的水平有点....
allen110119@tom.com
allen110119 2008-04-10
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 SH600016 的回复:]
最智能的方法是用户啥都不用按!
我以前做过这样的界面,当JTABLE某列的内容显示不了,在放有JTABLE的JPANEL内监听MOUSE的移动事件,当MOUSE移动时,提取行的内容,判定格子的内容是否能全部显示出来,如果不能在PAINTCOMPONTS重写代码,生成一个小方框,显示此格子的内容,呵呵,挺方便的
[/Quote]
楼上的所言甚是!!我最初想要的就是这样,但是考虑到自己的水平,只好退求其次,没想到“次”都还没实现
SH600016 2008-04-10
  • 打赏
  • 举报
回复
最智能的方法是用户啥都不用按!
我以前做过这样的界面,当JTABLE某列的内容显示不了,在放有JTABLE的JPANEL内监听MOUSE的移动事件,当MOUSE移动时,提取行的内容,判定格子的内容是否能全部显示出来,如果不能在PAINTCOMPONTS重写代码,生成一个小方框,显示此格子的内容,呵呵,挺方便的


allen110119 2008-04-10
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 mxx123 的回复:]
学习,请问如何实现JTABLE的双击某一行弹出对话框的事件呀?我的MSN:tianjin_123@hotmail.com
[/Quote]
对table监听鼠标事件,然后JOptionPane.showMessageDialog()即可
mxx123 2008-04-10
  • 打赏
  • 举报
回复
学习,请问如何实现JTABLE的双击某一行弹出对话框的事件呀?我的MSN:tianjin_123@hotmail.com
name99_6 2008-04-10
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 allen110119 的回复:]
因为我单元格中的数据是从数据库中提取的,有某一列中某些单元格中的数据可能会很长,如果用JTextArea来渲染单元格的话,虽然能解决自动换行的问题,但是这样就会使数据过长的单元格显得很突兀,影响整个表的美观
所以,我就像能在右键单击某个单元格时,能在这个单元格附近弹出一个像右键快捷菜单这样大小功能的东西(JTextArea?)来自动换行显示其中的数据。
[/Quote]
你可以自己写一个组件,里面加个JTextArea.当鼠标右击时c.setVisible(true);
加载更多回复(14)

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧