2017-08-08 36 views
1

私は既にこの解決策を探していましたが、うまくいかなかった。たぶん私の設定が違うからかもしれません。私は、エレベータシミュレータをしようとしていると私は、この図があります: diagram を、私はこのコードを持っている:java、swing - JScrollPaneにJlayeredPaneを追加すると、空白の背景のみが表示されます

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 

@SuppressWarnings("serial") 
public class Test extends JFrame { 

    public Test() { 

     Container contentPane = getContentPane(); 
     GridBagConstraints constraints = new GridBagConstraints(); 
     JButton floor = new JButton(); 
     JLabel cab = new JLabel(); 
     JPanel floorPanel = new JPanel(); 
     JPanel cabPanel = new JPanel(); 
     JLayeredPane layeredPane = new JLayeredPane(); 
     JScrollPane scroll = new JScrollPane(); 

     setResizable(false); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     contentPane.setBackground(Color.BLUE); 
     contentPane.setLayout(new GridBagLayout()); 

     constraints.insets = new Insets(20, 92, 20, 92); 

     floorPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); 
     floorPanel.setPreferredSize(new Dimension(165, 165)); 

     floor.setPreferredSize(new Dimension(165, 165)); 
     floor.setBackground(Color.WHITE); 
     floor.setText("1"); 

     cab.setPreferredSize(new Dimension(165, 165)); 
     cab.setText("Cab"); 
     cab.setBackground(Color.BLACK); 
     cab.setLocation(0, 0); 

     cabPanel.setLayout(null); 
     cabPanel.setPreferredSize(new Dimension(165, 165)); 
     cabPanel.setOpaque(false); 
     cabPanel.add(cab); 

     layeredPane.setLayout(new BorderLayout()); 
     layeredPane.setPreferredSize(new Dimension(165, 165)); 
     layeredPane.add(floorPanel, 0); 
     layeredPane.add(cabPanel, 1); 

     scroll.setMinimumSize(new Dimension(183, 660)); 
     scroll.setMaximumSize(new Dimension(183, 660)); 
     scroll.setViewportView(layeredPane); 

     contentPane.add(scroll, constraints); 

     pack(); 
     setVisible(true); 
    } 

} 

それはのJLayeredPaneに追加した2つのJPanelを表示し、唯一の空白の背景を表示する文句を言いません。 JLayeredPaneの2番目のレイヤーのJPanelでsetOpaque(false)を試しましたが、それでも動作しませんでした。

すでに解決策が見つかっている場合は、リンクを送信してください。 Ps。間違った文法にごめんなさい

+0

を[、あなたの質問に私たちの問題を示し、完全なシンプルな小さなプログラム例、コンパイルし、私たちのために走るものを作成して投稿してくださいmcve]。 –

+0

質問:JPanelにJLayeredPaneを埋め込むのはなぜですか?これはどんな目的にも役立たないようです。 –

+0

よろしくお願いいたします。私はそれについて知らなかったので、ここに新しい私はそれを編集するつもりです。 JPanelにはレイアウトがあり、JLayaredPaneにはデフォルトがありません。追加すると、レイヤ化された機能が削除されます。しかし、まだ動作しませんでした。 –

答えて

1

また、JLayeredPaneを使用すると、JLayeredPaneに追加されたコンポーネントの位置と位置を設定する必要があります。例えば

、チェックアウトして、このコードを実行します。

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.*; 
import javax.swing.border.Border; 

@SuppressWarnings("serial") 
public class LayeredExample extends JPanel { 

    public LayeredExample() { 
     int gridRows = 20; 
     int gridCols = 10; 
     JPanel panelA = new JPanel(new GridLayout(gridRows, gridCols)); 
     for (int i = 0; i < gridRows; i++) { 
      for (int j = 0; j < gridCols; j++) { 
       String labelText = String.format("[%d, %d]", j + 1, i + 1); 
       JLabel label = new JLabel(labelText); 

       Border outsideBorder = BorderFactory.createLineBorder(Color.BLUE); 
       Border insideBorder = BorderFactory.createEmptyBorder(3, 3, 3, 3); 
       label.setBorder(BorderFactory.createCompoundBorder(outsideBorder, insideBorder)); 
       panelA.add(label); 
      } 
     } 
     panelA.setBorder(BorderFactory.createTitledBorder("Panel A")); 
     panelA.setSize(panelA.getPreferredSize()); 
     panelA.setLocation(0, 0); 

     JLabel dragMeLabel = new JLabel("Drag Me!"); 
     dragMeLabel.setFont(dragMeLabel.getFont().deriveFont(Font.BOLD, 54f)); 
     JPanel panelB = new JPanel(new GridBagLayout()); 
     panelB.add(dragMeLabel); 
     panelB.setBorder(BorderFactory.createTitledBorder("Panel B")); 
     panelB.setPreferredSize(new Dimension(800, 500)); 
     panelB.setSize(panelB.getPreferredSize()); 
     panelB.setLocation(200, 200); 

     MouseAdapter myMouse = new MouseAdapter() { 
      private Point p0; 
      private Point loc0; 

      @Override 
      public void mousePressed(MouseEvent e) { 
       p0 = e.getLocationOnScreen(); 
       loc0 = ((JComponent) e.getSource()).getLocation(); 
      } 

      private void moveComponent(MouseEvent e) { 
       if (p0 == null || loc0 == null) { 
        return; 
       } 
       Point p1 = e.getLocationOnScreen(); 
       JComponent comp = (JComponent)e.getSource(); 
       Container cont = comp.getParent(); 
       int x = loc0.x + p1.x - p0.x; 
       int y = loc0.y + p1.y - p0.y; 
       Point loc1 = new Point(x, y); 
       comp.setLocation(loc1); 
       cont.repaint(); 
      } 

      @Override 
      public void mouseDragged(MouseEvent e) { 
       moveComponent(e); 
      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       moveComponent(e); 
       p0 = null; 
       loc0 = null; 
      } 
     }; 

     panelB.addMouseListener(myMouse); 
     panelB.addMouseMotionListener(myMouse); 

     JLayeredPane layeredPane = new JLayeredPane(); 
     layeredPane.add(panelA, JLayeredPane.DEFAULT_LAYER); 
     layeredPane.add(panelB, JLayeredPane.PALETTE_LAYER); 
     layeredPane.setPreferredSize(new Dimension(1600, 1200)); 

     JScrollPane scrollPane = new JScrollPane(layeredPane); 
     scrollPane.getViewport().setPreferredSize(new Dimension(800, 650)); 

     setLayout(new BorderLayout()); 
     add(scrollPane); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("LayeredExample"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new LayeredExample()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
+0

次の例は、指定されたインデックスに従わないJLayeredPaneに関する問題を修正したものです。あなたの助けに感謝します。 :D –

+0

@MarvindelaVega:ようこそ –

関連する問題