2014-01-21 48 views
-2

我开始这个新问题,因为this question已被投票关闭,因为它没有MVCE。调整JScrollPane以考虑Windows任务栏

我现在已经将SSCCE问题包括进去了。

请看看下面的代码

import javax.swing.*; 
import java.awt.*; 

public class ScrollPaneTest { 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      JFrame frame=new JFrame(); 
      frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 

      JTabbedPane tabbedPane=new JTabbedPane(); 


      tabbedPane.addTab("Tab 1", new JScrollPane(getPanel())); 
      tabbedPane.addTab("Tab 2", new JScrollPane(getPanel())); 

      frame.setContentPane(tabbedPane); 
      frame.pack(); 
      frame.setVisible(true); 
     } 



     private JPanel getPanel() { 
      JPanel panel=new JPanel(); 
      Box box = Box.createVerticalBox(); 
      for (int i = 1; i <= 100; i++) { 
       box.add(new JLabel("This is Label #" + i)); 
      } 
      panel.add(box); 
      return panel; 
     } 
    }); 
    } 
} 

当我运行这段代码,我得到如下图所示

Last JLabel getting cut by taskbar.

在相同的代码框架,如果我加入

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

然后框架出现在任务栏上方。我希望我的JFrame停止在Windows任务栏上方。

+1

为什么不在“JList”中显示这些标签? –

+0

@sethu请你真的想做什么 – mKorbel

+0

我想我的JFrame扩展到任务栏的高度。宽度应该足够适合其中的选项卡窗格。当我将滚动窗格中的面板添加到选项卡窗格中并将选项卡窗格放置在框架中时,面板中的最后一个组件会像图像中显示的那样被剪切。 – sethu

回答

1

这基本上是一个小黑客。

这样做是使用屏幕边界减去它的插入来计算不仅窗口的高度,而且还鼓励窗口出现在可用桌面空间内的位置。

主要的原因,就是我有我的任务栏钉在我屏幕的顶部...

import java.awt.GraphicsConfiguration; 
import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.Insets; 
import java.awt.Rectangle; 
import java.awt.Toolkit; 
import javax.swing.Box; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTabbedPane; 
import javax.swing.SwingUtilities; 
import javax.swing.WindowConstants; 

public class ScrollPaneTest { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 

       JTabbedPane tabbedPane = new JTabbedPane(); 

       tabbedPane.addTab("Tab 1", new JScrollPane(getPanel())); 
       tabbedPane.addTab("Tab 2", new JScrollPane(getPanel())); 

       frame.setContentPane(tabbedPane); 
       frame.pack(); 
       Rectangle viewBounds = getScreenViewableBounds(); 
       frame.setSize(frame.getWidth(), viewBounds.height); 
       frame.setLocation(viewBounds.x, viewBounds.y); 
       frame.setVisible(true); 
      } 

      private JPanel getPanel() { 
       JPanel panel = new JPanel(); 
       Box box = Box.createVerticalBox(); 
       for (int i = 1; i <= 100; i++) { 
        box.add(new JLabel("This is Label #" + i)); 
       } 
       panel.add(box); 
       return panel; 
      } 
     }); 
    } 

    public static Rectangle getScreenViewableBounds() { 

     GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     GraphicsDevice gd = ge.getDefaultScreenDevice(); 

     Rectangle bounds = new Rectangle(0, 0, 0, 0); 

     if (gd != null) { 

      GraphicsConfiguration gc = gd.getDefaultConfiguration(); 
      bounds = gc.getBounds(); 

      Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc); 

      bounds.x += insets.left; 
      bounds.y += insets.top; 
      bounds.width -= (insets.left + insets.right); 
      bounds.height -= (insets.top + insets.bottom); 

     } 

     return bounds; 

    } 
} 

您也不妨考虑使用Scrollable接口限制可视区域,例如...

import java.awt.Dimension; 
import java.awt.GraphicsConfiguration; 
import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.Insets; 
import java.awt.Rectangle; 
import java.awt.Toolkit; 
import javax.swing.Box; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTabbedPane; 
import javax.swing.Scrollable; 
import javax.swing.SwingUtilities; 
import javax.swing.WindowConstants; 

public class ScrollPaneTest { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 

       JTabbedPane tabbedPane = new JTabbedPane(); 

       tabbedPane.addTab("Tab 1", new JScrollPane(getPanel())); 
       tabbedPane.addTab("Tab 2", new JScrollPane(getPanel())); 

       frame.setContentPane(tabbedPane); 
       frame.pack(); 
       frame.setVisible(true); 
      } 

      private JPanel getPanel() { 
       JPanel panel = new ScrollablePane(); 
       Box box = Box.createVerticalBox(); 
       for (int i = 1; i <= 100; i++) { 
        box.add(new JLabel("This is Label #" + i)); 
       } 
       panel.add(box); 
       return panel; 
      } 
     }); 
    } 

    public static class ScrollablePane extends JPanel implements Scrollable { 

     @Override 
     public Dimension getPreferredScrollableViewportSize() { 
      return new Dimension(200, 400); 
     } 

     @Override 
     public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { 
      return 32; 
     } 

     @Override 
     public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { 
      return 32; 
     } 

     @Override 
     public boolean getScrollableTracksViewportWidth() { 
      return false; 
     } 

     @Override 
     public boolean getScrollableTracksViewportHeight() { 
      return false; 
     } 

    } 
} 
+2

'JList'似乎是完美的,不需要任何黑客。请参阅原始线程上的[我的答案](http://stackoverflow.com/a/21247788/418556).. –

+1

@AndrewThompson没有任何争议,但没有任何背景知道OP实际上试图实现什么,标签可能只是一个更复杂的界面的代表。但我同意,现在看来,“JList”似乎更适合。 – MadProgrammer

+0

@MadProgrammer ..那是真的。实际的JPanel比重复标签更复杂。我只是用它来演示发生了什么。上面关于设置边界的建议违背了不在任何摆动组件上设置边界的原则,而是使用布局管理器。所以如果我明白了这一点,在这种情况下,除了设置边界之外没有别的办法......对吧? – sethu