То, что я хочу сделать:
Я создал класс таблицы, расширяющий JTable. Моя цель - отобразить изображение, найденное в Интернете, после получения ввода от пользователя (на данный момент я просто использую жесткий код для тестирования). Один столбец должен быть классом ImageIcon, второй - String. При использовании класса Test JTable (не расширен) правильно рисуется, я не могу получить расширенный, чтобы отображать его вообще. Я думаю, что я пропускаю что-то в классе TeamTable, но я не могу понять, что это такое, и почему класс Test (расположенный в конце сообщения) действительно работает.Добавление продлен JTable в JFrame
Главный вопрос:
Почему Test.java правильно отображать JTable с ImageIcon, но мой RoundRobin.java + TeamTable.java ничего не отображается на всех?
Код:
public class TeamTable extends JTable{
public static final String[] columnNames = {"Team Logo", "Team"};
public static final Object[][] data = new Object[1][2]; // For test purposes set to [1][2], final value [8][2]
public TeamTable(){
JTable table = new JTable();
configureTeamTable(table); // Override the getColumnClass, set the model
} // Loop through all teams and assing the names and logos
public static void configureTeamTable(JTable table){
DefaultTableModel model = new DefaultTableModel(data, columnNames){
@Override
public Class<?> getColumnClass(int column){
return getValueAt(0, column).getClass();
}
};
table.setModel(model);
table.setRowHeight(50);
for(int i = 0 ; i < 1 ; i ++){ // For test purposes set to 1, final value 8
ImageIcon currentTeamLogo = new ImageIcon(RoundRobin.getTeam(i).getLogo());
String currentTeamName = RoundRobin.getTeam(i).getName();
data[i][0] = currentTeamLogo;
data[i][1] = currentTeamName;
}
}
}
Это расширенная JTable класс, я создаю новый JTable, перекрывая метод getColumnClass и установка обоих столбцов, используя вход, собранные от пользователя в главном классе.
public class Team {
private String name;
private Image logo;
private ArrayList<String> players;
public Team(String name){
this.name = name;
}
public Team(){}
public void searchImg(){
try{
URL url = new URL("http://www.wearjersey.com/product_images/uploaded_images/milanlogo.jpg");
this.logo = ImageIO.read(url);
}catch(IOException e){
System.out.println("IOe");
}
}
public void resizeLogo(){
Image tempImg = this.getLogo();
tempImg = tempImg.getScaledInstance(30,30, java.awt.Image.SCALE_SMOOTH);
setLogo(tempImg);
}
} //only GETTERS and SETTERS below, removed to keep the code shorter
Это класс команды, на данный момент он всегда ищет те же изображения, и может изменить его размер, чтобы 30x30px размера. Основной метод ниже:
public class RoundRobin {
private JFrame frame;
private static ArrayList<Team> teams;
private static int teamCounter = 0;
final int HEIGHT = 400; //1024
final int LENGTH = 600; //1920
public static void main(String[] args) {
RoundRobin rr = new RoundRobin();
rr.paintStuff();
rr.initFirstUI();
}
public void paintStuff() {
frame = new JFrame();
frame.setSize(LENGTH, HEIGHT);
frame.getContentPane().setLayout(new MigLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
} // initiates, sets size etc.
public void initFirstUI() { // creates the first part of the UI, which will later be replaced by group ladder
teams = new ArrayList();
frame.add(new JLabel("Teams"), "wrap, align center");
JButton addTeamBut = new JButton("Add a team");
frame.add(addTeamBut);
addTeamBut.addActionListener(new AddTeamAct());
refresh();
}
public void refresh() { // just a revaildate + refresh method
frame.revalidate();
frame.repaint();
}
public static Team getTeam(int index) {
return teams.get(index);
}
class AddTeamAct implements ActionListener {
@Override
public void actionPerformed(ActionEvent ae) {
if(teamCounter < 1){ // For test purposes set to 1, final value 8
String name = JOptionPane.showInputDialog("Name of the team");
Team currentTeam = new Team(name);
currentTeam.searchImg();
currentTeam.resizeLogo();
teams.add(currentTeam);
teamCounter++;
}
if(teamCounter == 1){ // For test purposes set to 1, final value 8
TeamTable a = new TeamTable();
frame.add(a);
}
refresh();
}
}
}
============== Тест класс работает, что основное различие между Test.java и TjE TeamTable.java? Test.java правильно отображает JFrame.
public class Test {
private JFrame frame;
private JTable teamTable;
private Image logo;
public static void main(String[] args) {
Test test = new Test();
test.paintStuff();
test.addTab();
}
public void paintStuff(){
frame = new JFrame();
frame.setSize(800, 600);
frame.getContentPane().setLayout(new MigLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public void addTab(){
searchImg();
resizeLogo();
ImageIcon a = new ImageIcon(logo);
String[] columnNames = {"Team"};
Object[][] data = new ImageIcon[8][1];
data[0][0] = a;
for(int i = 0 ; i < 8 ; i ++){
data[i][0] = a;
}
DefaultTableModel model = new DefaultTableModel(data, columnNames);
teamTable = new JTable(model){
public Class getColumnClass(int column){
return getValueAt(0, column).getClass();
}
};
teamTable.setRowHeight(50);
frame.add(teamTable);
frame.revalidate();
frame.repaint();
}
public void searchImg(){
try{
URL url = new URL("http://www.wearjersey.com/product_images/uploaded_images/milanlogo.jpg");
this.logo = ImageIO.read(url);
}catch(IOException e){
System.out.println("IOException");
}
}
public void resizeLogo(){
Image tempImg = this.logo;
tempImg = tempImg.getScaledInstance(30,30, java.awt.Image.SCALE_SMOOTH);
logo = tempImg;
}
}
Спасибо за понимание.
1) Для лучшей помощи в ближайшее время отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve) (минимальный полный проверяемый пример) или [SSCCE] (http://www.sscce.org/) (Короткий, самосохраненный, правильный пример). 2) Единственная пустая строка пробела в исходном коде - это все, что требуется *. Пустые строки после '{' или before '}' также типично избыточны. 3) Один из способов получить изображение (-ы) для примера - это горячая ссылка на изображения, увиденные в [этот вопрос и ответы] (http://stackoverflow.com/q/19209650/418556). 4) 'TeamTable' расширяет' JTable' и имеет экземпляр. Это может быть проблемой. Почему *** *** вы расширяете таблицу? –
@AndrewThompson: большое спасибо! –
@HovercraftFullOfEels * «По крайней мере, ваши изображения доступны онлайн» * ..LOL! Я полностью не заметил этого. OP: Игнорируйте третью точку в моем комментарии выше, поскольку код * уже делает это. *: P –