2013-11-20 154 views
1

嗨我有这个问题,我的单元格在我的JTable自动对齐,只在事件发生后的第一列。我使用我的其他类的TableModel以及表格。如果你想看,我可以给你看我其他班的代码。表格单元格自动对齐

我已经尝试设置与此代码比对:

DefaultTableCellRenderer leftRenderer = new DefaultTableCellRenderer(); 
leftRenderer.setHorizontalAlignment(JLabel.LEFT); 
table.getColumnModel().getColumn(1).setCellRenderer(leftRenderer); 

没有解决不了它的。

package gui; 

import java.awt.BorderLayout; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.List; 

import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingConstants; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableCellRenderer; 

import mappers.MemberMapper; 
import domains.Member; 

public class EditMemberGUI { 
    private JFrame editMemberFrame; 
    private JPanel btnsPanel, panel; 
    private JButton editBtn, cancelBtn; 
    private JLabel fNameLbl, lNameLbl, addressLbl, zipCodeLbl, cityLbl, emailLbl, 
        phoneNoLbl; 
    private JTextField fNameTF, lNameTF, addressTF, zipCodeTF, cityTF, emailTF, 
    phoneNoTF; ; 
    private GridLayout layout; 

    public EditMemberGUI(final ShowMembersGUI gui) { 

     layout = new GridLayout(0,2,1,0); 

     panel = new JPanel(); 
     panel.setLayout(layout); 
     layout.setVgap(0); 

     fNameLbl = new JLabel("Fornavn: "); 
     fNameTF = new JTextField(15); 

     lNameLbl = new JLabel("Efternavn: "); 
     lNameTF = new JTextField(15); 

     addressLbl = new JLabel("Adresse: "); 
     addressTF = new JTextField(15); 


     zipCodeLbl = new JLabel("Postnummer: "); 
     zipCodeTF = new JTextField(15); 

     cityLbl = new JLabel("By: "); 
     cityTF = new JTextField(15); 

     emailLbl = new JLabel("Email: "); 
     emailTF = new JTextField(15); 

     phoneNoLbl = new JLabel("Telefonnr: "); 
     phoneNoTF = new JTextField(15); 

     panel.add(fNameLbl); 
     panel.add(fNameTF); 
     panel.add(lNameLbl); 
     panel.add(lNameTF); 
     panel.add(addressLbl); 
     panel.add(addressTF); 
     panel.add(zipCodeLbl); 
     panel.add(zipCodeTF); 
     panel.add(cityLbl); 
     panel.add(cityTF); 
     panel.add(emailLbl); 
     panel.add(emailTF); 
     panel.add(phoneNoLbl); 
     panel.add(phoneNoTF); 


     //------------ 

     btnsPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); 

     editBtn = new JButton("Redigér"); 
     editBtn.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e) {     
       int zipCode = Integer.parseInt(zipCodeTF.getText()); 
       Member m = new Member(fNameTF.getText(), lNameTF.getText(), 
         addressTF.getText(), zipCode, cityTF.getText(), 
         emailTF.getText(), phoneNoTF.getText()); 
       MemberMapper mMapper = new MemberMapper(); 
       int i = gui.getIndex(); 
       mMapper.editMember(m, i); 

       editMemberFrame.setVisible(false); 


       List<Member> data = mMapper.selectAllMembers(); 
       MyTableModel myTableModel = new MyTableModel(data); 

       gui.getTable().setModel(myTableModel); 
       int row = gui.getTable().getSelectedRow(); 
       myTableModel.tableUpdate(row, m); 

      } 
     }); 

     cancelBtn = new JButton("Cancel"); 
     cancelBtn.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       editMemberFrame.setVisible(false); 
      } 
     }); 

     btnsPanel.add(editBtn); 
     btnsPanel.add(cancelBtn); 

    } 

    public void showGUI() { 

     editMemberFrame = new JFrame(); 
     editMemberFrame.setTitle("Redigér Medlem"); 
     editMemberFrame.setLayout(new BorderLayout()); 
     editMemberFrame.setSize(400,300); 

     editMemberFrame.add(panel, BorderLayout.CENTER); 
     editMemberFrame.add(btnsPanel, BorderLayout.SOUTH); 
     //editMemberFrame.pack(); 
     editMemberFrame.setVisible(true); 
    } 

    public JTextField getfNameTF() { 
     return fNameTF; 
    } 

    public void setfNameTF(JTextField fNameTF) { 
     this.fNameTF = fNameTF; 
    } 

    public JTextField getlNameTF() { 
     return lNameTF; 
    } 

    public void setlNameTF(JTextField lNameTF) { 
     this.lNameTF = lNameTF; 
    } 

    public JTextField getAddressTF() { 
     return addressTF; 
    } 

    public void setAddressTF(JTextField addressTF) { 
     this.addressTF = addressTF; 
    } 

    public JTextField getZipCodeTF() { 
     return zipCodeTF; 
    } 

    public void setZipCodeTF(JTextField zipCodeTF) { 
     this.zipCodeTF = zipCodeTF; 
    } 

    public JTextField getCityTF() { 
     return cityTF; 
    } 

    public void setCityTF(JTextField cityTF) { 
     this.cityTF = cityTF; 
    } 

    public JTextField getEmailTF() { 
     return emailTF; 
    } 

    public void setEmailTF(JTextField emailTF) { 
     this.emailTF = emailTF; 
    } 

    public JTextField getPhoneNoTF() { 
     return phoneNoTF; 
    } 

    public void setPhoneNoTF(JTextField phoneNoTF) { 
     this.phoneNoTF = phoneNoTF; 
    } 
    } 

回答

1

你不显示,建立表的实际数据的代码,但我认为得到右对齐是不同的行中的数据类型。 getColumnClass()方法的默认实现可能会为该列分配不同的呈现器。要确认这一点,请尝试交换传递到数据模型的数据中的列,并查看右对齐是否与相同的数据一起移动。

指定您自己的渲染器应该解决问题,但另一种解决方案是扩展DefaultTableModel并专门定义getColumnClass()方法中第一列的类。

+0

这是不是很奇怪,它只是第一列呢? – ilhami

+0

我不知何故通过更改列类来修复它。 :) 谢谢! – ilhami

+0

@Ilhami Integer.class和其他数字在表格单元格中对齐。 Object.class和String.class不应该。 –

1

为了这个目的,你需要自己TableCellRenderer或可以覆盖的DefaultTableCellRenderergetTableCellRendererComponent()方法,例如:

private TableCellRenderer getCellRenderer() { 
    return new DefaultTableCellRenderer(){ 
     @Override 
     public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4, int arg5) { 
      //logic for Alignment 
      setHorizontalAlignment(left ? JLabel.LEFT : JLabel.RIGHT); 
      return super.getTableCellRendererComponent(arg0, arg1, arg2, arg3, arg4, arg5); 
     } 
    }; 
} 

这里left是布尔变量作为定位标志。

编辑:这就像你交 试试:

table.getColumnModel().getColumn(1).setCellRenderer(getCellRenderer()); 

getCellRenderer()回报渲染你的专栏,你needt自行调用它的方法。

编辑: 这里有一个例子

public class Form extends JFrame { 

    private Boolean left = true; 

    public Form(){ 

     final JTable t = new JTable(new DefaultTableModel(new Object[][]{{1,2,3},{4,5,6}},new Object[]{"a","b","c"})); 
     t.getColumnModel().getColumn(0).setCellRenderer(getCellRenderer()); 
     getContentPane().add(new JScrollPane(t)); 
     JButton change = new JButton("change"); 
     change.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       left = !left; 
       t.repaint(); 
      } 
     }); 
     getContentPane().add(change,BorderLayout.SOUTH); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    private TableCellRenderer getCellRenderer() { 
     return new DefaultTableCellRenderer(){ 
      @Override 
      public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4, int arg5) { 
       setHorizontalAlignment(left ?JLabel.LEFT : JLabel.RIGHT); 
       return super.getTableCellRendererComponent(arg0, arg1, arg2, arg3, arg4, arg5); 
      } 
     }; 
    } 

    public static void main(String[] args) { 
     new Form(); 
    } 
} 
+0

我该如何调用该方法? \t \t \t \t getCellRenderer()。getTableCellRendererComponent(gui.getTable(),value,true,true,row,column);什么应该是有价值的? – ilhami

+0

没有/保持原样。您正在重写需要您自己的特殊TableCellRenderer类的函数。 –