2015-09-12 7 views
7

में बटन के आस-पास की जगह को हटाकर मेरे पास another question पर उल्लिखित गेम स्क्रीन के लिए एक लेआउट प्रदर्शित करने के लिए लिखा गया यह व्यंग्य स्रोत है। यह GridBagLayout में बटन (या लेबल, स्टार्ट-अप पर चुनने योग्य) डालता है।GridBagLayout

यदि आप संकेत दिए जाने पर बटन का उपयोग नहीं करना चुनते हैं (जीयूआई प्रकट होने से पहले) संपूर्ण जीयूआई अच्छा है और कोई अंतर नहीं है। लेकिन आप बटन का उपयोग करने के लिए चुन अगर यह (यदि आपके सेट अप मेरे जैसे है) कुछ इस तरह लाल क्षैतिज लाइनों दिखेगा ..

enter image description here

नोट। पैनल के बीजी रंग के माध्यम से दिखा रहा है। जीयूआई लेबल का उपयोग करते समय उन रेखाओं को नहीं देखा जाता है। जीयूआई को थोड़ा सा देखने के लिए कि यह प्रत्येक पंक्ति के बाद एक लाल रेखा भी नहीं लगा रहा है (नौ पंक्तियां हैं) - हालांकि प्रत्येक पंक्ति बटन (एक ही घटक) का उपयोग करती है।

बटन का उपयोग करते समय अतिरिक्त लंबवत स्थान को कैसे हटाया जाए?

मुझे लगता है कि यह कुछ ऐसा होना चाहिए जो मैं बटन या पंक्ति भार को कॉन्फ़िगर करते समय करना भूल रहा हूं, लेकिन मैं यह नहीं समझ सकता!

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

import java.net.URL; 
import javax.imageio.ImageIO; 

public class SoccerField { 

    private JPanel ui = null; 
    int[] x = {0, 35, 70, 107, 142, 177, 212, 247, 282, 315}; 
    int[] y = {0, 45, 85, 140, 180, 225, 265, 280, 320, 345}; 
    boolean buttons; 

    SoccerField() { 
     initUI(); 
    } 

    public void initUI() { 
     int result = JOptionPane.showConfirmDialog(ui, "Use buttons?"); 
     buttons = result == JOptionPane.OK_OPTION; 
     if (ui != null) { 
      return; 
     } 

     ui = new JPanel(new GridBagLayout()); 
     ui.setBackground(Color.RED); 

     try { 
      URL url = new URL("http://i.stack.imgur.com/9E5ky.jpg"); 
      BufferedImage img = ImageIO.read(url); 
      BufferedImage field = img.getSubimage(100, 350, 315, 345); 

      BufferedImage[] bi = subSampleImageColumns(field); 
      BufferedImage[][] fieldParts = new BufferedImage[bi.length][]; 
      for (int ii=0; ii<bi.length; ii++) { 
       fieldParts[ii] = subSampleImageRows(bi[ii]); 
      } 
      for (int ii=0; ii<fieldParts[0].length; ii++) { 
       for (int jj=0; jj<fieldParts.length; jj++) { 
        addImageToPanel(ui, fieldParts[ii][jj], ii, jj); 
       } 
      } 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    private void addImageToPanel(JPanel panel, BufferedImage img, int row, int col) { 
     Insets insets = new Insets(0,0,0,0); 
     GridBagConstraints gbc = new GridBagConstraints(
       row, col, 
       1, 1, 
       .5, .5, 
       GridBagConstraints.CENTER, 
       GridBagConstraints.BOTH, 
       insets, 0, 0); 
     ImageIcon ii = new ImageIcon(img); 
     JButton b = new JButton(ii); 
     b.setBorder(null); 
     b.setBorderPainted(false); 
     b.setContentAreaFilled(false); 
     Component c = buttons ? b : new JLabel(ii); 
     panel.add(c, gbc); 
    } 

    private BufferedImage[] subSampleImageColumns(BufferedImage img) { 
     System.out.println("Image Size: " + img.getWidth() + "," + img.getHeight()); 
     BufferedImage[] imageRows = new BufferedImage[x.length - 1]; 
     for (int ii = 0; ii < x.length - 1; ii++) { 
      BufferedImage bi = img.getSubimage(
        x[ii], 0, x[ii + 1] - x[ii], img.getHeight()); 
      imageRows[ii] = bi; 
     } 

     return imageRows; 
    } 

    private BufferedImage[] subSampleImageRows(BufferedImage img) { 
     BufferedImage[] imageRows = new BufferedImage[y.length - 1]; 
     for (int ii = 0; ii < y.length - 1; ii++) { 
      BufferedImage bi = img.getSubimage(
        0, y[ii], img.getWidth(), y[ii + 1] - y[ii]); 
      imageRows[ii] = bi; 
     } 

     return imageRows; 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception useDefault) { 
       } 
       SoccerField o = new SoccerField(); 

       JFrame f = new JFrame(o.getClass().getSimpleName()); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setLocationByPlatform(true); 

       f.setContentPane(o.getUI()); 
       f.pack(); 
       //f.setMinimumSize(f.getSize()); 

       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
+1

बेवकूफ सवाल: आपके बटन की सीमा की स्थापना (सभी 4 मूल्यों के लिए 0 के सन्निवेश वाली के साथ) को निर्दिष्ट एक 'EmptyBorder' की कोशिश की है बजाय' null' की? क्या यह कुछ बदलता है? – Laf

+0

@ लाफ नहीं, यह एक बेवकूफ सवाल नहीं है और हाँ मुझे यकीन है कि। वही प्रभाव एकमात्र कारण मैंने एक संस्करण प्रदान नहीं किया है जो कार्यक्षमता को जोड़ने में आलस्य है (जैसा कि कोड की एक पंक्ति को बदलने और फिर से सम्मिलित करने के विरोध में) और उसके बाद हर बार एक या दूसरे को चुनना होता है। ;) –

+1

@ लाफ एक तरफ के रूप में, वह कोड ** ** पूरी तरह से स्वयं निहित है, इसलिए लोगों को चलाने के लिए यह बहुत आसान होना चाहिए। यह छवि को रन-टाइम पर सीधे imgur से खींचता है। –

उत्तर

6

नोट किया गया है कि बटन की पसंदीदा ऊंचाई बटन (कुछ मामलों में) के लिए सही ढंग से गणना नहीं की जाती है।

मामलों में जहां लेबल की ऊंचाई 40 है में, बटन की ऊंचाई हमेशा एक विषम संख्या के आकार परिवर्तन था 41.

इसके बटन की तरह?

मैं कोड बदल दिया है:

//int[] y = {0, 45, 85, 140, 180, 225, 265, 280, 320, 345}; 
int[] y = {0, 45, 86, 139, 180, 225, 266, 279, 320, 345}; 

और यह काम करने लगता है।

आह, बस कारण मिला। तुम भी जरूरत है:

b.setFocusPainted(false); 
+1

* ".. और ऐसा लगता है। .. आह, सिर्फ कारण मिला" * हां, यही वह है। प्रतिभाशाली! –

संबंधित मुद्दे