问题描述
我想强调一个JTable单元格的文本。
这是我的code:
当我得到的testingHighlighter方法指定单元格的编辑器,并刻意突出该编辑器组件的文本。请帮我在哪里,我错了。
公共类测试扩展的JFrame
{
的DefaultTableModel模型;
JTable的表;
字符串COL [] = {姓名,地址,电话,测试}; 公共静态无效的主要(字符串ARGS [])
{
测试T =新的测试();
t.start();
t.testingHightligher(); } 公共无效的start()
{ 模型=新的DefaultTableModel(COL,2);
表=新的JTable(模型){@覆盖
公共布尔的isCellEditable(INT为arg0,ARG1 INT){ 返回true;
}}; JScrollPane的窗格=新JScrollPane的(表); setColumnEditor(table.getColumnModel()。getColumn(0),新的对象[] {和
OR},逻辑运算符);
[对象] OBJ文件=新的对象[] {==,=};
setColumnEditor(table.getColumnModel()getColumn(2),OBJ文件,逻辑运算符。); JTextField的领域=新的JTextField();
DefaultCellEditor编辑器=新DefaultCellEditor(场); editor.setClickCountToStart(1);
TableColumn的山口= table.getColumnModel()getColumn(3)。 col.setCellEditor(编辑); DefaultTableCellRenderer呈现=新DefaultTableCellRenderer();
renderer.setToolTipText(点击编辑);
col.setCellRenderer(渲染); table.getColumnModel()getColumn(0).SET preferredWidth(25)。
table.getColumnModel()getColumn(1).SET preferredWidth(120)。
table.getColumnModel()getColumn(2).SET preferredWidth(25)。
table.getColumnModel()getColumn(3).SET preferredWidth(100)。 。table.getTableHeader()setReorderingAllowed(假); table.setValueAt(csanuragjain,0,3); 加(面板);
调用setVisible(真);
的setSize(500,400);
的setLayout(新的FlowLayout());
setDefaultCloseOperation(EXIT_ON_CLOSE);
} 私人无效setColumnEditor(TableColumn的关口,对象[] editValues,字符串renderTip)
{
JComboBox的下拉框中= NULL;
如果(editValues!= NULL)
{
组合框=新的JComboBox(editValues);
}
其他
{
组合框=新的JComboBox();
} comboBox.setMaximumRowCount(6); DefaultCellEditor编辑器=新DefaultCellEditor(组合框);
editor.setClickCountToStart(2);
col.setCellEditor(编辑); DefaultTableCellRenderer呈现=新DefaultTableCellRenderer(); renderer.setToolTipText(renderTip);
col.setCellRenderer(渲染);
的TableCellRenderer的HeaderRenderer = col.getHeaderRenderer();
如果(的HeaderRenderer的instanceof DefaultTableCellRenderer)
{
((DefaultTableCellRenderer)的HeaderRenderer).setToolTipText(测试);
}
} 无效testingHightligher()
{
对象值= table.getValueAt(0,3);
的JTextField字段=(JTextField中)table.getColumnModel()getColumn(3).getCellEditor()getTableCellEditorComponent(表中,值,真,0,3)。。 尝试
{ 。field.getHighlighter()addHighlight(0,3,新javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(Color.RED)); }
赶上(BadLocationException的前)
{
ex.printStackTrace();
}
}
}请帮我在哪里我错了..
您的下一个问题,你试着突出TableCellEditor的,你看编辑的JTable 在启动<$ C; C>,但在那一刻,你看到的只是CellRenderer中,您可以通过添加
table.editCellAt(0,3)解决您的code $ C> testingHightligher()
方法。也叫你的测试就像在接下来的code你的的main()
:
SwingUtilities.invokeLater(Runnable的新(){ @覆盖
公共无效的run(){
t.testingHightligher();
}
});
如果你想突出
的JTable
文本而这是无法编辑,你需要使用的。 是教程的。
例如:
的TableCellRenderer R =新的TableCellRenderer(){
JTextField的F =新的JTextField(); @覆盖
公共组件getTableCellRendererComponent(JTable中为arg0,ARG1对象,布尔ARG2,布尔ARG3,诠释ARG4,诠释arg5){
如果(ARG1!= NULL){
f.setText(arg1.toString());
尝试{
。f.getHighlighter()addHighlight(0,3,新javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(Color.RED));
}赶上(BadLocationException的E){
e.printStackTrace();
}
}其他{
f.setText();
f.getHighlighter()removeAllHighlights()。
}
返回F;
}
};
您需要somthin这个样子,我也建议您更换
的JTextField
这里由的JLabel
和hightligh它像这里写
编辑:
下面是完整的例子给你,它的工作原理,观察和审视它:
公共类表扩展的JFrame { 私人字符串textForSearch =;
私人的JTable吨; 公开形式(){
的DefaultTableModel模型;
T =新的JTable(型号=新的DefaultTableModel(新对象[] [] {},新的对象[] {1}));
对(INT I = 0; I&小于10;我++){
model.addRow(新的对象[] {I});
}
的for(int i = 0; I&LT; t.getColumnCount();我++){
t.getColumnModel()getColumn(ⅰ).setCellRenderer(getRenderer())。
} JScrollPane的JSP =新JScrollPane的(T);
最后RightPanel右=新RightPanel();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
加(JSP,BorderLayout.CENTER);
加(右,BorderLayout.EAST);
包();
setLocationRelativeTo(NULL);
} 私人的TableCellRenderer getRenderer(){
返回新的TableCellRenderer(){
JTextField的F =新的JTextField(); @覆盖
公共组件getTableCellRendererComponent(JTable中为arg0,ARG1对象,布尔ARG2,布尔ARG3,诠释ARG4,诠释arg5){
如果(ARG1!= NULL){
f.setText(arg1.toString());
串串= arg1.toString();
如果(string.contains(textForSearch)){
INT的indexOf = string.indexOf(textForSearch);
尝试{
。f.getHighlighter()addHighlight(的indexOf,的indexOf + textForSearch.length(),新javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(Color.RED));
}赶上(BadLocationException的E){
e.printStackTrace();
}
}
}其他{
f.setText();
f.getHighlighter()removeAllHighlights()。
}
返回F;
}
};
} 公共静态无效的主要(字串[] args)抛出异常{
SwingUtilities.invokeLater(Runnable的新(){ 公共无效的run(){
新表()调用setVisible(真);
}
});
} 类RightPanel继承JPanel {
公共RightPanel(){
的setLayout(新的GridBagLayout());
GridBagConstraints的C =新的GridBagConstraints();
c.insets =新插图(5,5,5,5);
c.gridy = 0;
最终的JTextField F =新的JTextField,(5);
加(F,C);
JButton的B =的新的JButton(搜索);
b.addActionListener(新的ActionListener(){ @覆盖
公共无效的actionPerformed(ActionEvent的为arg0){
textForSearch = f.getText();
t.repaint();
}
});
c.gridy ++;
加(B,C);
}
}}
I am trying to highlight the text of a jtable cell. This is my code: when i am getting the editor for specified cell in testingHighlighter method and trying to highlight the text in that editor component. please help me where i am wrong.
public class test extends JFrame
{
DefaultTableModel model;
JTable table;
String col[] = {"Name","Address","Phone","test"};
public static void main(String args[])
{
test t = new test();
t.start();
t.testingHightligher();
}
public void start()
{
model = new DefaultTableModel(col,2);
table=new JTable(model){@Override
public boolean isCellEditable(int arg0, int arg1) {
return true;
}};
JScrollPane pane = new JScrollPane(table);
setColumnEditor( table.getColumnModel().getColumn( 0 ), new Object[] { "AND",
"OR" }, "Logical Operator" );
Object[] objs = new Object[] { "==", "=" };
setColumnEditor( table.getColumnModel().getColumn( 2 ), objs, "Logical Operator");
JTextField field = new JTextField();
DefaultCellEditor editor = new DefaultCellEditor( field );
editor.setClickCountToStart( 1 );
TableColumn col = table.getColumnModel().getColumn( 3 );
col.setCellEditor( editor );
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
renderer.setToolTipText( "click to edit" );
col.setCellRenderer( renderer );
table.getColumnModel().getColumn( 0 ).setPreferredWidth( 25 );
table.getColumnModel().getColumn( 1 ).setPreferredWidth( 120 );
table.getColumnModel().getColumn( 2 ).setPreferredWidth( 25 );
table.getColumnModel().getColumn( 3 ).setPreferredWidth( 100 );
table.getTableHeader().setReorderingAllowed( false );
table.setValueAt("csanuragjain",0,3);
add(pane);
setVisible(true);
setSize(500,400);
setLayout(new FlowLayout());
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
private void setColumnEditor( TableColumn col, Object[] editValues, String renderTip )
{
JComboBox comboBox = null;
if( editValues != null )
{
comboBox = new JComboBox( editValues );
}
else
{
comboBox = new JComboBox();
}
comboBox.setMaximumRowCount( 6 );
DefaultCellEditor editor = new DefaultCellEditor( comboBox );
editor.setClickCountToStart( 2 );
col.setCellEditor( editor );
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
renderer.setToolTipText( renderTip );
col.setCellRenderer( renderer );
TableCellRenderer headerRenderer = col.getHeaderRenderer();
if( headerRenderer instanceof DefaultTableCellRenderer )
{
( (DefaultTableCellRenderer) headerRenderer ).setToolTipText( "test" );
}
}
void testingHightligher()
{
Object value = table.getValueAt(0, 3);
JTextField field = (JTextField) table.getColumnModel().getColumn( 3 ).getCellEditor().getTableCellEditorComponent(table, value, true, 0, 3);
try
{
field.getHighlighter().addHighlight(0, 3, new javax.swing.text.DefaultHighlighter.DefaultHighlightPainter( Color.RED ));
}
catch(BadLocationException ex)
{
ex.printStackTrace();
}
}
}
Please help me where i am wrong..
解决方案
Your problem in next, you try to highlight text in TableCellEditor, which you see when editing a cell of
JTable
, but in that moment you see only CellRenderer, you can fix your code by adding table.editCellAt(0, 3);
at start of testingHightligher()
method. Also call your test like next code in your main()
:
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
t.testingHightligher();
}
});
IF you want to highlight text in
JTable
while it isn't edit, you need to use TableCellRenderer
. Here is tutorial for that.
Example :
TableCellRenderer r = new TableCellRenderer() {
JTextField f = new JTextField();
@Override
public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4, int arg5) {
if(arg1 != null){
f.setText(arg1.toString());
try {
f.getHighlighter().addHighlight(0,3,new javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(Color.RED));
} catch (BadLocationException e) {
e.printStackTrace();
}
} else {
f.setText("");
f.getHighlighter().removeAllHighlights();
}
return f;
}
};
You need somthin like this, also I recommend you replace
JTextField
here by JLabel
and hightligh it like written here
EDIT:
Here is full example for you, it works, watch and examine it:
public class Form extends JFrame {
private String textForSearch = "";
private JTable t;
public Form() {
DefaultTableModel model;
t = new JTable(model = new DefaultTableModel(new Object[][]{},new Object[]{1}));
for(int i =0;i<10;i++){
model.addRow(new Object[]{i});
}
for(int i =0;i<t.getColumnCount();i++){
t.getColumnModel().getColumn(i).setCellRenderer(getRenderer());
}
JScrollPane jsp = new JScrollPane(t);
final RightPanel right = new RightPanel();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(jsp, BorderLayout.CENTER);
add(right, BorderLayout.EAST);
pack();
setLocationRelativeTo(null);
}
private TableCellRenderer getRenderer() {
return new TableCellRenderer() {
JTextField f = new JTextField();
@Override
public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4, int arg5) {
if(arg1 != null){
f.setText(arg1.toString());
String string = arg1.toString();
if(string.contains(textForSearch)){
int indexOf = string.indexOf(textForSearch);
try {
f.getHighlighter().addHighlight(indexOf,indexOf+textForSearch.length(),new javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(Color.RED));
} catch (BadLocationException e) {
e.printStackTrace();
}
}
} else {
f.setText("");
f.getHighlighter().removeAllHighlights();
}
return f;
}
};
}
public static void main(String[] args) throws Exception {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Form().setVisible(true);
}
});
}
class RightPanel extends JPanel{
public RightPanel(){
setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(5, 5, 5, 5);
c.gridy = 0;
final JTextField f = new JTextField(5);
add(f,c);
JButton b = new JButton("search");
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
textForSearch = f.getText();
t.repaint();
}
});
c.gridy++;
add(b,c);
}
}
}
这篇关于突出一个JTable中单元格的文本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!