Java - Как правильно добавить несколько панелей с фоновым изображением?

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

-SplitTable: на этой панели несколько ярлыков будут отображать некоторые важные данные. Половина размера SplitPanel и вертикальная, в левой части экрана.

-SplitPanel: Здесь головоломка будет отображаться на панели, которая будет находиться поверх существующего изображения.

-SplitMainView: здесь все собрано

-SplitCustomPanel: код для пользовательских панелей

По-видимому, все работает нормально, но если вы внимательно посмотрите и добавите границы к панелям, вы увидите, что происходит какое-то наложение.

Что я должен сделать, чтобы исправить это и заставить их занимать правильное место?

public SplitTable(SplitModel model){
    this.model = model;
    setLayout(new GridLayout(1,6));

    java.net.URL urls = ClassLoader.getSystemResource("Imagenes/vertical.jpg");
    Toolkit kit = Toolkit.getDefaultToolkit();
    Image back = kit.createImage(urls);
    p = new SplitCustomPanel(back, 346, 900, 0, 0);
    p.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2, true));
    la1 = new JLabel(" ");
    la2 = new JLabel(" ");
    la3 = new JLabel(" ");
    la4 = new JLabel(" ");
    la5 = new JLabel(" ");
    la6 = new JLabel(" ");
    p.add(la1);
    p.add(la2);
    p.add(la3);
    p.add(la4);
    p.add(la5);
    p.add(la6);
    add(p);}


public SplitPanel(SplitModel model){
    this.model = model;

    setLayout(new GridLayout(1,6));

    java.net.URL urls = ClassLoader.getSystemResource("Imagenes/tap1.jpg");
    Toolkit kit = Toolkit.getDefaultToolkit();
    Image back = kit.createImage(urls);
    p = new SplitCustomPanel(back, 1200, 900, 300, 0);
    p.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2, true));        
    la1 = new JLabel(" ");
    la2 = new JLabel(" ");
    la3 = new JLabel(" ");
    la4 = new JLabel(" ");
    la5 = new JLabel(" ");
    la6 = new JLabel(" ");
    p.add(la1);
    p.add(la2);
    p.add(la3);
    p.add(la4);
    p.add(la5);
    p.add(la6);  
    add(p);}

public SplitMainView(SplitModel model){
    super("Splitter");

    java.net.URL urls = ClassLoader.getSystemResource("Imagenes/ese.jpg");
    Toolkit kit = Toolkit.getDefaultToolkit();
    Image imgs = kit.createImage(urls);
    this.setIconImage(imgs);

    this.model = model;
    JPanel p = new JPanel();

    p.setLayout(new GridBagLayout());

    GridBagConstraints ct = new GridBagConstraints();
    GridBagConstraints cp = new GridBagConstraints();

    ct.fill = GridBagConstraints.BOTH;
    cp.fill = GridBagConstraints.BOTH;

    ct.weightx = 1.0;
    ct.weighty = 1.0;
    cp.weightx = 1.0;
    cp.weighty = 1.0;

    ct.gridheight = 8;
    ct.gridwidth = 2;
    ct.gridx = 0;
    ct.gridy = 0;
    cp.gridheight = 8;
    cp.gridwidth = 8;
    cp.gridx = 0;
    cp.gridy = 2;

    menu = new SplitMenuBar();
    panel = new SplitPanel(model);
    table = new SplitTable(model);

    this.setJMenuBar(menu);
    p.add(table, ct);
    p.add(panel, cp);
    this.add(p);


    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);

открытый класс SplitCustomPanel расширяет JPanel {

private Image back;
private int w;
private int h;
private int x;
private int y;

public SplitCustomPanel(Image backe, int w, int h, int x, int y) {
    this.back = backe;
    this.w = w;
    this.h = h;
    this.x = x;
    this.y = y;
}


@Override
public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    g2.drawImage(back, x, y, w, h, this);
}

Вот как это выглядит: http://i.stack.imgur.com/An0hg.jpg< /а>


person KornÖzz    schedule 12.12.2013    source источник


Ответы (1)


Как показано здесь, используйте getSubimage(), чтобы разрезать исходное изображение по границам пикселей. В примере измените размер фрейма, чтобы увидеть, как выравниваются компоненты без полей. Используйте drawImage() для объединения фрагментов, только если это необходимо. Если это так, вызовите super.paintComponent(), чтобы избежать артефактов рендеринга.

person trashgod    schedule 12.12.2013
comment
Определенно полезно для более поздних вопросов, но сейчас я сосредоточен на правильной установке фона кадра, исключительно, еще не с самой головоломкой, не могли бы вы дать несколько советов по этому поводу? - person KornÖzz; 12.12.2013
comment
Извините, я немного не понимаю, чего вы пытаетесь достичь. Предполагая, что это эффект раскрытия, вы можете посмотреть на SplitPaneDemo в SwingSet2. Для скользящих частей см. этот пример и вариация. В вашем sscce получите доступ к опубликованным изображениям через URL, как показано здесь. - person trashgod; 12.12.2013