表格单元格自动对齐
嗨我有这个问题,我的单元格在我的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;
}
}
你不显示,建立表的实际数据的代码,但我认为得到右对齐是不同的行中的数据类型。 getColumnClass()
方法的默认实现可能会为该列分配不同的呈现器。要确认这一点,请尝试交换传递到数据模型的数据中的列,并查看右对齐是否与相同的数据一起移动。
指定您自己的渲染器应该解决问题,但另一种解决方案是扩展DefaultTableModel
并专门定义getColumnClass()
方法中第一列的类。
为了这个目的,你需要自己TableCellRenderer
或可以覆盖的DefaultTableCellRenderer
getTableCellRendererComponent()
方法,例如:
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();
}
}
我该如何调用该方法? \t \t \t \t getCellRenderer()。getTableCellRendererComponent(gui.getTable(),value,true,true,row,column);什么应该是有价值的? – ilhami
没有/保持原样。您正在重写需要您自己的特殊TableCellRenderer类的函数。 –
这是不是很奇怪,它只是第一列呢? – ilhami
我不知何故通过更改列类来修复它。 :) 谢谢! – ilhami
@Ilhami Integer.class和其他数字在表格单元格中对齐。 Object.class和String.class不应该。 –