2012-05-07 1 views
2

AWTUtilities.setWindowOpaque()JFrame에 사용하여 JScrollPane을 사용하는 픽셀 단위 투명도를 사용하고 있습니다. 투명도가 켜져 있으면 해당 창에서의 스크롤은 느리지 만 느려지고 느려집니다. Windows 7 및 JDK 6에서이 작업을 시도하십시오.픽셀 단위의 투명도를 사용하는 경우 JScrollPane의 스크롤 속도가 매우 느림

public class MainFrame extends JFrame { 
    super(); 

    setUndecorated(true); 
    AWTUtilities.setWindowOpaque(this, false); //this turns JScrollPane inside of this JFrame slow and laggy 
} 

누가이 문제를 발행 했습니까? 감사!

+1

빨리 (A [SSCCE] (http://sscce.org/) – mKorbel

+1

에서 [sscce] 따르십시오 당신의 질문을 수정 더 나은 도움을 중요한 자바 버전과 너무 기본 OS를 수 http://sscce.org/) 지침. 이 표준을 따르면 다른 사람들이 귀하의 질문에 쉽게 답할 수 있습니다. – eabraham

답변

3

내가 어떤 스크롤 문제를 볼 수없고, 좋은 스윙 규칙을 기반으로 코드에 대한 테스트 시나리오를 만드는 데,이 코드는 프로세서와 GPU, Java6을 위해 매우 너무 열심히

Win7에 64B입니다 JList의 또는 JTextArea에 또는 JTextPan JTable의 또는 나는이 JScrollPane의에 대한 게으른 스크롤을 시연 할 수있어

import com.sun.awt.AWTUtilities; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 
import javax.swing.table.TableModel; 

public class ViewPortFlickeringOriginal { 

    private JFrame frame = new JFrame("Table"); 
    private JViewport viewport = new JViewport(); 
    private Rectangle RECT = new Rectangle(); 
    private Rectangle RECT1 = new Rectangle(); 
    private JTable table = new JTable(50, 3); 
    private javax.swing.Timer timer; 
    private int count = 0; 
    private GradientViewPortOriginal tableViewPort; 
    private static boolean loggerOpacity; 
    private JPanel panel = new JPanel(); 
    private static JButton button; 

    public ViewPortFlickeringOriginal() { 
     tableViewPort = new GradientViewPortOriginal(table); 
     viewport = tableViewPort.getViewport(); 
     viewport.addChangeListener(new ChangeListener() { 

      @Override 
      public void stateChanged(ChangeEvent e) { 
       if (tableViewPort.bolStart) { 
        RECT = table.getCellRect(0, 0, true); 
        RECT1 = table.getCellRect(table.getRowCount() - 1, 0, true); 
        Rectangle viewRect = viewport.getViewRect(); 
        if (viewRect.intersects(RECT)) { 
         System.out.println("Visible RECT -> " + RECT); 
         tableViewPort.paintBackGround(new Color(250, 150, 150)); 
        } else if (viewRect.intersects(RECT1)) { 
         System.out.println("Visible RECT1 -> " + RECT1); 
         tableViewPort.paintBackGround(new Color(150, 250, 150)); 
        } else { 
         System.out.println("Visible RECT1 -> ???? "); 
         tableViewPort.paintBackGround(new Color(150, 150, 250)); 
        } 
       } 
      } 
     }); 
     frame.add(tableViewPort); 
     button = new JButton("Change Opacity for Java6/Win7"); 
     button.setBounds(100, 100, 50, 50); 
     button.setVisible(true); 
     panel.add(button); 
     loggerOpacity = true; 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent evt) { 
       Object src = evt.getSource(); 
       if (src == button && loggerOpacity) { 
        AWTUtilities.setWindowOpacity(frame, 0.80f); 
       } 
      } 
     }); 
     frame.add(panel, BorderLayout.SOUTH); 
     frame.setPreferredSize(new Dimension(600, 300)); 
     frame.pack(); 
     frame.setLocation(50, 100); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     RepaintManager.setCurrentManager(new RepaintManager() { 

      @Override 
      public void addDirtyRegion(JComponent c, int x, int y, int w, int h) { 
       Container con = c.getParent(); 
       while (con instanceof JComponent) { 
        if (!con.isVisible()) { 
         return; 
        } 
        if (con instanceof GradientViewPortOriginal) { 
         c = (JComponent) con; 
         x = 0; 
         y = 0; 
         w = con.getWidth(); 
         h = con.getHeight(); 
        } 
        con = con.getParent(); 
       } 
       super.addDirtyRegion(c, x, y, w, h); 
      } 
     }); 
     frame.setVisible(true); 
     start(); 
    } 

    private void start() { 
     timer = new javax.swing.Timer(100, updateCol()); 
     timer.start(); 
    } 

    public Action updateCol() { 
     return new AbstractAction("text load action") { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 

       System.out.println("updating row " + (count + 1)); 
       TableModel model = table.getModel(); 
       int cols = model.getColumnCount(); 
       int row = 0; 
       for (int j = 0; j < cols; j++) { 
        row = count; 
        table.changeSelection(row, 0, false, false); 
        timer.setDelay(100); 
        Object value = "row " + (count + 1) + " item " + (j + 1); 
        model.setValueAt(value, count, j); 
       } 
       count++; 
       if (count >= table.getRowCount()) { 
        timer.stop(); 
        table.changeSelection(0, 0, false, false); 
        java.awt.EventQueue.invokeLater(new Runnable() { 

         @Override 
         public void run() { 
          table.clearSelection(); 
          tableViewPort.bolStart = true; 
         } 
        }); 
       } 
      } 
     }; 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ViewPortFlickeringOriginal viewPortFlickering = new ViewPortFlickeringOriginal(); 
      } 
     }); 
    } 
} 

class GradientViewPortOriginal extends JScrollPane { 

    private static final long serialVersionUID = 1L; 
    private final int h = 50; 
    private BufferedImage img = null; 
    private BufferedImage shadow = new BufferedImage(1, h, BufferedImage.TYPE_INT_ARGB); 
    private JViewport viewPort; 
    public boolean bolStart = false; 

    public GradientViewPortOriginal(JComponent com) { 
     super(com); 
     viewPort = this.getViewport(); 
     viewPort.setScrollMode(JViewport.BLIT_SCROLL_MODE); 
     viewPort.setScrollMode(JViewport.BACKINGSTORE_SCROLL_MODE); 
     viewPort.setScrollMode(JViewport.SIMPLE_SCROLL_MODE); 
     paintBackGround(new Color(250, 150, 150)); 
    } 

    public void paintBackGround(Color g) { 
     Graphics2D g2 = shadow.createGraphics(); 
     g2.setPaint(g); 
     g2.fillRect(0, 0, 1, h); 
     g2.setComposite(AlphaComposite.DstIn); 
     g2.setPaint(new GradientPaint(0, 0, new Color(0, 0, 0, 0f), 0, h, 
       new Color(0.1f, 0.8f, 0.8f, 0.5f))); 
     g2.fillRect(0, 0, 1, h); 
     g2.dispose(); 
    } 

    @Override 
    public void paint(Graphics g) { 
     if (img == null || img.getWidth() != getWidth() || img.getHeight() != getHeight()) { 
      img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); 
     } 
     Graphics2D g2 = img.createGraphics(); 
     super.paint(g2); 
     Rectangle bounds = getViewport().getVisibleRect(); 
     g2.scale(bounds.getWidth(), -1); 
     int y = (getColumnHeader() == null) ? 0 : getColumnHeader().getHeight(); 
     g2.drawImage(shadow, bounds.x, -bounds.y - y - h, null); 
     g2.scale(1, -1); 
     g2.drawImage(shadow, bounds.x, bounds.y + bounds.height - h + y, null); 
     g2.dispose(); 
     g.drawImage(img, 0, 0, null); 
    } 
} 

하지만 코드에서 enter image description hereenter image description hereenter image description hereenter image description here

다른 사람의 JComponent에 포함되어 있습니다 잠재적 답변자에 대한 전자

import java.awt.Color; 
import java.awt.Component; 
import java.awt.GridLayout; 
import java.awt.event.AdjustmentEvent; 
import java.awt.event.AdjustmentListener; 
import javax.swing.*; 

public class ListPanel extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public ListPanel() { 
     setLayout(new GridLayout(0, 2, 10, 10)); 
     DefaultListModel model = new DefaultListModel(); 
     model.addElement(createButtons("one")); 
     model.addElement(createButtons("two")); 
     model.addElement(createButtons("three")); 
     model.addElement(createButtons("four")); 
     model.addElement(createButtons("five")); 
     model.addElement(createButtons("six")); 
     model.addElement(createButtons("seven")); 
     model.addElement(createButtons("eight")); 
     model.addElement(createButtons("nine")); 
     model.addElement(createButtons("ten")); 
     model.addElement(createButtons("eleven")); 
     model.addElement(createButtons("twelwe")); 
     JList list = new JList(model); 
     list.setCellRenderer(new PanelRenderer()); 
     JScrollPane scroll1 = new JScrollPane(list); 
     final JScrollBar scrollBar = scroll1.getVerticalScrollBar(); 
     scrollBar.addAdjustmentListener(new AdjustmentListener() { 

      @Override 
      public void adjustmentValueChanged(AdjustmentEvent e) { 
       System.out.println("JScrollBar's current value = " + scrollBar.getValue()); 
      } 
     }); 
     add(scroll1); 
     JScrollPane scroll2 = new JScrollPane(createPanel()); 
     add(scroll2);   
     final JScrollBar scrollBar1 = scroll2.getVerticalScrollBar(); 
     scrollBar1.addAdjustmentListener(new AdjustmentListener() { 

      @Override 
      public void adjustmentValueChanged(AdjustmentEvent e) { 
       System.out.println("JScrollBar's current value = " + scrollBar1.getValue()); 
      } 
     }); 

    } 

    public static JPanel createPanel() { 
     JPanel panel = new JPanel(); 
     panel.setLayout(new GridLayout(0, 1, 1, 1)); 
     panel.add(createButtons("one")); 
     panel.add(createButtons("two")); 
     panel.add(createButtons("three")); 
     panel.add(createButtons("four")); 
     panel.add(createButtons("five")); 
     panel.add(createButtons("six")); 
     panel.add(createButtons("seven")); 
     panel.add(createButtons("eight")); 
     panel.add(createButtons("nine")); 
     panel.add(createButtons("ten")); 
     panel.add(createButtons("eleven")); 
     panel.add(createButtons("twelwe")); 
     return panel; 
    } 

    public static JButton createButtons(String text) { 
     JButton button = new JButton(text); 
     return button; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ListPanel frame = new ListPanel(); 
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
       //frame.pack(); 
       frame.setSize(270, 200); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    class PanelRenderer implements ListCellRenderer { 

     @Override 
     public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
      JButton renderer = (JButton) value; 
      renderer.setBackground(isSelected ? Color.red : list.getBackground()); 
      return renderer; 
     } 
    } 
} 
+0

Ha, JScrollPane의 뷰포트에 적절한 스크롤 모드를 설정하면 작업이 완료되었습니다! 고마워요! 매우 도움이됩니다. –

+0

@ Jay Gridley 동의, 올바른 방법 – mKorbel