2014-10-15 3 views
-1

Я пытаюсь добавить JTable в свой JPanel, но он там не отображается. Я искал другие вопросы, но предлагаемые решения не помогли мне.Показать JTable в JPanel

Функция, приведенная ниже, является частью класса, который расширяет JFrame. «repaint» - это BufferedImage, «imageLabel» - это JLabel, а «образ» - ImageIcon.

public void showTable() { 
    try { 
     repaint = ImageIO.read(new File("filename.jpg")); 
    } catch (IOException e) { } 

    Graphics g = repaint.createGraphics(); 
    g.setFont(font); 
    g.setColor(black); 
    String[] columnsName = {"id","text"}; 
    Object[][] data = {{new Integer(1),"text one"},{new Integer(2),"text two"}}; 
    JTable table = new JTable(data, columnsName); 
    JScrollPane tableContainer = new JScrollPane(table); 
    image = new ImageIcon(repaint.getScaledInstance(sizeX,sizeY, Image.SCALE_SMOOTH)); 
    imageLabel.setIcon(image); 
    imageLabel.add(tableContainer,BorderLayout.CENTER); 
    getContentPane().add(imageLabel); 

    pack(); 
    setVisible(true); 
    repaint(); 
    revalidate(); 
} 

Что я хочу достичь, это отображать таблицу поверх загруженного изображения.

Заранее спасибо за помощь :)

+1

ли вы установили менеджер компоновки для 'imageLabel'? JLabel по умолчанию имеет нулевой макет. Нам нужно установить его, если мы хотим добавить к нему компоненты –

+1

Почему вы пытаетесь поместить все в 'JLabel'? – khelwood

+0

Вы ошибаетесь в работе - не используете диспетчер компоновки, ожидая, что константа BorderLayout.CENTER будет работать, если контейнер еще не использует BorderLayout, получая ваш объект Graphics через 'getGraphics()' ... время до начните читать учебники, поскольку он каждый раз гадает. –

ответ

1

Я не уверен, если я правильно понял, но вы хотите поместить таблицу и изображение под ним, не так ли? Я бы создал JPanel с BorderLayout, поместил изображение (JLabel) в нижнюю часть (конец страницы) и таблицу (которая создала прокрутку) по центру. Если вам нужна помощь при добавлении элементов в JPanel с BorderLayout, посмотрим, как это сделать на этом руководство: http://docs.oracle.com/javase/tutorial/uiswing/layout/border.html

Я надеюсь, что это помогает.

2
  1. Дайте вашему JLabel менеджер компоновки, здесь BorderLayout через setLayout(new BorderLayout()).
  2. Не возвращайте объект Graphics через getGraphics(), так как он возвращает объект, который недолговечен. Чтобы убедиться в этом, скройте свою программу, а затем восстановите ее и посмотрите, как исчезнет ваш рисунок. Вместо этого нарисуйте метод переопределения paintComponent(...).
  3. Прочтите учебники Swing для более подробной информации о том, как это сделать, особенно учебник менеджера макетов.
+1

Царапина моей головы. Ваш ответ полностью отличается от принятого ответа. Вы отвечаете на предположение, что OP хочет, чтобы метка была фоном, что я и предполагал (тип кода подсказок, который). Принятый ответ предлагает нечто совершенно иное. Кто знает :/ –

-1

Спасибо за все намеки до сих пор :) Они были действительно полезны. Я знаю, что я могу делать некоторые вещи в не элегантно, но я все еще учусь, будет пытаться улучшить :)

данной подсказки и некоторые более поиска привел меня к такому коду:

public void showTable() 
    { 
    try 
    { 
     repaint = ImageIO.read(new File("filename.jpg")); 
    }catch (IOException e) { 
    } 
    Graphics g = repaint.createGraphics(); 
    g.setFont(font); 
    g.setColor(black); 
    String[] columnsName = {"id","text"}; 
    Object[][] data = {{new Integer(1),"text one"},{new Integer(2),"text two"}}; 
    JTable table = new JTable(data, columnsName); 
    table.setOpaque(false); 
    JScrollPane tableContainer = new JScrollPane(table); 
    tableContainer.setBorder(BorderFactory.createEmptyBorder()); 
    tableContainer.setOpaque(false); 
    tableContainer.getViewport().setOpaque(false); 
    image = new ImageIcon(repaint.getScaledInstance(sizeX,sizeY, Image.SCALE_SMOOTH)); 
    imageLabel.setIcon(image); 
    imageLabel.setLayout(new BorderLayout()); 
    imageLabel.add(tableContainer, BorderLayout.SOUTH); 
    repaint(); 
    revalidate(); 
    } 

Который работает хорошо для меня :)

Еще раз спасибо всем за помощь :)

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