2015-05-17 3 views
0

То, что я хочу сделать:

Я создал класс таблицы, расширяющий 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

1) Для лучшей помощи в ближайшее время отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve) (минимальный полный проверяемый пример) или [SSCCE] (http://www.sscce.org/) (Короткий, самосохраненный, правильный пример). 2) Единственная пустая строка пробела в исходном коде - это все, что требуется *. Пустые строки после '{' или before '}' также типично избыточны. 3) Один из способов получить изображение (-ы) для примера - это горячая ссылка на изображения, увиденные в [этот вопрос и ответы] (http://stackoverflow.com/q/19209650/418556). 4) 'TeamTable' расширяет' JTable' и имеет экземпляр. Это может быть проблемой. Почему *** *** вы расширяете таблицу? –

+1

@AndrewThompson: большое спасибо! –

+0

@HovercraftFullOfEels * «По крайней мере, ваши изображения доступны онлайн» * ..LOL! Я полностью не заметил этого. OP: Игнорируйте третью точку в моем комментарии выше, поскольку код * уже делает это. *: P –

ответ

4

TeamTable и распространяется JTable и имеет экземпляр JTable. Это может быть проблемой.

Как в стороне, то, что пытается достичь код, кажется лучше реализованным по методу фабрики, чем путем расширения JTable.

Смежные вопросы