2014-01-21 47 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