Reputation: 41
Hi I am having this issue where my cells in my JTable automatic aligns right, only in the first column after an event. I am using my TableModel from my other class as well as the table. I can show you the code of my other class if you want to see it.
I have tried to set alignment with this code:
DefaultTableCellRenderer leftRenderer = new DefaultTableCellRenderer();
leftRenderer.setHorizontalAlignment(JLabel.LEFT);
table.getColumnModel().getColumn(1).setCellRenderer(leftRenderer);
That didn't solve it either.
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;
}
}
Upvotes: 1
Views: 420
Reputation: 10994
For this purposes you need your own TableCellRenderer
or you can override getTableCellRendererComponent()
method of DefaultTableCellRenderer
, for example:
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);
}
};
}
here left
is boolean variable as a flag for alignment.
EDIT: Try it here like you post :
table.getColumnModel().getColumn(1).setCellRenderer(getCellRenderer());
getCellRenderer()
return renderer for your column, you needt to call its methods by yourself.
EDIT: here is an example
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();
}
}
Upvotes: 1
Reputation: 23629
You don't show the code that builds the actual data for the table, but I assume the datatypes in the row that get right aligned is different. The default implementation of the getColumnClass()
method is possibly assigning that column a different renderer. To confirm this try swapping columns in your the data you pass to the data model and see if the right-alignment moves with the same data.
Specifying your own renderer should fix the issue, but another solution would be to extend the DefaultTableModel
and specifically define the class of the first column in the getColumnClass()
mehtod.
Upvotes: 1