2013-11-20 152 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類的函數。 –