2016-10-27 1 views
1

Я использую следующий построить, чтобы отобразить до 3-х изображений на этикетках в зависимости от необходимости:Отображение нескольких изображений в результатах ScrollPane в компонентах отсутствующие в зависимости от размера изображения

TabbedPane 
|_ScrollPane 
    |_Panel with BorderLayout 
    |_Label with ImageIcon (Placed North) 
    |_Label with ImageIcon (Placed Center) 
    |_Panel with BorderLayout (Placed South) 
     |_Label with ImageIcon (Placed North) 
     |_Button (Placed West) 
     |_Button (Placed East) 

Изображения, размещенные на этикетках являются 1654 * 2340 пикселей каждый («null.jpg» составляет 1 * 1 пиксель)

С помощью кнопки на другой вкладке я могу распечатать различные параметры, которые я считаю важными во время тестирования (в основном размер/положение компонентов).

Если я использую «null.jpg» в качестве изображения для третьего ярлыка, все работает так, как должно быть; Я вижу 2 картинки и кнопки (и, если не смотреть дополнительный пиксель «null.jpg»).
Если я перехожу к использованию другого изображения размером 1654 * 2340 пикселей, все гаснет: кнопки отсутствуют, третье изображение не отображается и (смотря на параметры, выданные дополнительной кнопкой), размер двух кнопок, которые предполагается, что есть -2305 пикселей.

Результаты от размера изображения неоспоримым (не) отображается на второй панели (2340 пикселей), а высота второй панели (35 пикселей) -> 35-2340 = -2305

Однако у меня нет идея, почему это происходит с использованием меньшего изображения, все работает так, как предполагалось. Как видно из приведенного ниже кода, я проверил различные параметры: от размеров ярлыков по панелям до положения и размера кнопки.

Почему это происходит и как я могу это исправить? Я ищу 4 часа подряд и не могу найти, почему это происходит. Ниже приведен примерный пример кода, который фактически воспроизводит проблему. Убираю комментарий на ImageIcon p3 и размещая его перед другой строкой, определяющей p3, возвращает разные результаты.
Снова: p1-p3 - это изображения размером 1654 * 2340 пикселей, где «null» равен 1 * 1.
Если что-то еще необходимо, я очень хочу помочь!
Любая помощь очень ценится!

package my_package; 

import java.awt.EventQueue; 

import javax.swing.*; 

import java.awt.*; 
import java.awt.event.*; 
import java.io.File; 
import java.net.MalformedURLException; 

public class testsforSO extends JFrame { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        testsforSO frame = new testsforSO(); 
        frame.setSize(300, 300); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

public testsforSO() { 
     getContentPane().setLayout(new BorderLayout(0, 0)); 

     JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); 
     getContentPane().add(tabbedPane); 

     JPanel panel = new JPanel(); 

     JScrollPane scrollPane = new JScrollPane(); 
     tabbedPane.addTab("Pictures", null, scrollPane, null); 

     JPanel panel_1 = new JPanel(); 
     scrollPane.setViewportView(panel_1); 
     panel_1.setLayout(new BorderLayout(0, 0)); 

     JLabel lblNewLabel = new JLabel(); 
     panel_1.add(lblNewLabel, BorderLayout.NORTH); 

     JLabel lblNewLabel_1 = new JLabel(); 
     panel_1.add(lblNewLabel_1, BorderLayout.CENTER); 

     JPanel panel_2 = new JPanel(); 
     panel_1.add(panel_2, BorderLayout.SOUTH); 
     panel_2.setPreferredSize(new Dimension(scrollPane.getWidth(), 35)); 
     panel_2.setLayout(new BorderLayout(0, 0)); 

     JLabel lblNewLabel_2 = new JLabel(); 
     panel_2.add(lblNewLabel_2, BorderLayout.NORTH); 

     JButton btnNewButton = new JButton("Saving Button"); 
     panel_2.add(btnNewButton, BorderLayout.WEST); 

     JButton btnNewButton_1 = new JButton("Printing Button"); 
     panel_2.add(btnNewButton_1, BorderLayout.EAST); 

     try { 
      ImageIcon p1 = new ImageIcon(new File("C:\\path\\to\\p1.jpg").toURI().toURL()); 
      ImageIcon p2 = new ImageIcon(new File("C:\\path\\to\\p2.jpg").toURI().toURL()); 
      ImageIcon p3 = new ImageIcon(new File("C:\\path\\to\\p3.jpg").toURI().toURL()); 
      //ImageIcon p3 = new ImageIcon(new File("C:\\path\\to\\null.jpg").toURI().toURL()); 

      lblNewLabel.setIcon(p1); 
      lblNewLabel_1.setIcon(p2); 
      lblNewLabel_2.setIcon(p3); 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } 

     JButton btnMyButton = new JButton("Details"); 
     btnMyButton.setBounds(10, 11, 89, 23); 
     btnMyButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       System.out.println("1 Height"+lblNewLabel.getHeight()+" Y: "+ lblNewLabel.getY()); 
       System.out.println("2 Height"+lblNewLabel_1.getHeight()+" Y: "+ lblNewLabel_2.getY()); 
       System.out.println("3 Width: "+lblNewLabel_2.getSize().getWidth()+" Height: "+lblNewLabel_2.getSize().getHeight()); 
       System.out.println("3 x/y: "+SwingUtilities.convertPoint(lblNewLabel_2, lblNewLabel_2.getLocation(), panel_1).toString()); 
       System.out.println("End of 2: "+(lblNewLabel_1.getY()+lblNewLabel_1.getHeight())); 
       System.out.println("Panel_2.isVisible: "+Boolean.toString(panel_2.isVisible())); 
       System.out.println("Panel_2 x/y/w/h: "+panel_2.getX()+" "+panel_2.getY()+" "+panel_2.getWidth()+" "+panel_2.getHeight()); 
       System.out.println("Saving Button x/y/w/h: "+btnNewButton.getX()+" "+btnNewButton.getY()+" "+btnNewButton.getWidth()+" "+btnNewButton.getHeight());} 
     }); 
     panel.setLayout(null); 
     panel.add(btnMyButton); 
     tabbedPane.add("Update Button", panel); 
    } 

} 

Быстрого редактирование: Я не получаю ошибку исключения или компилятора ...

+1

У меня проблемы. Вы ограничиваете высоту панели, удерживающей третье изображение, и кнопки вручную с линией 'panel_2.setPreferredSize (...)' до 35 пикселей. И вот что случилось. Если я удалю эту строку, я смогу увидеть все три изображения и кнопки. – ArcticLord

+0

... Я мог буквально бить себя прямо сейчас ... Большое спасибо! Сначала это было результатом теста, который я сделал в этой программе, но в моей основной программе также используется одна и та же линия, и я этого не заметил. Я даже не могу вспомнить, что я положил его туда ... Не могли бы вы добавить это как ответ, так что этот вопрос отмечен как решенный? Еще раз спасибо! – geisterfurz007

+0

Готово. Иногда он просто нуждается в второй паре глаз: D – ArcticLord

ответ

1

Вы ограничили панель, которая удерживает третье изображение и кнопки на максимальную высоту 35px с этой линией:

panel_2.setPreferredSize(new Dimension(scrollPane.getWidth(), 35)); 

Этого было достаточно, чтобы отображать кнопки, когда изображение имеет нулевой размер. Но для большого изображения была показана только верхняя часть, и для кнопок не осталось места.

Удаление этой линии поможет решить вашу проблему.

+0

Я вижу ... Тестирование с помощью разноцветных изображений помогло бы мне. ..Но поскольку конец изображения и начало являются белыми, а они прямо за другим, я не вижу никакой разницы ... – geisterfurz007

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