主頁 > .NET開發 > 如何使用SpringLayout垂直排列組件

如何使用SpringLayout垂直排列組件

2022-02-22 00:29:14 .NET開發

顯然我對 SpringLayout 有一些不明白的地方。我正在嘗試創建一個類,即 JPanel 的擴展,它允許我添加組件并讓它們垂直顯示,寬度相同。

我對 JPanel 的擴展會將其 LayoutManager 設定為使用 SpringLayout,并且每次添加組件時,它都會放入 SpringLayout 約束以將其附加到第一個組件的面板,然后將每個組件附加到前一個組件。

首先,這是一個 Oracle 撰寫的使用 SpringLayout 的示例,我將其更改為垂直放置組件而不是水平放置:

/*
 * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Oracle or the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

import javax.swing.SpringLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.Container;

public class SpringDemo3
{
  /**
   * Create the GUI and show it. For thread safety, this method should be
   * invoked from the event-dispatching thread.
   */
  private static void createAndShowGUI()
  {
    // Create and set up the window.
    JFrame frame = new JFrame("SpringDemo3");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Set up the content pane.
    Container contentPane = frame.getContentPane();
    SpringLayout layout = new SpringLayout();
    contentPane.setLayout(layout);

    // Create and add the components.
    JLabel label = new JLabel("Label: ");
    JTextField textField = new JTextField("Text field", 15);
    contentPane.add(label);
    contentPane.add(textField);

    // Adjust constraints for the label so it's at (5,5).
    layout.putConstraint(SpringLayout.WEST, label, 5, SpringLayout.WEST, contentPane);
    layout.putConstraint(SpringLayout.NORTH, label, 5, SpringLayout.NORTH, contentPane);

    // Adjust constraints for the text field so it's at
    // (<label's right edge>   5, 5).
//    layout.putConstraint(SpringLayout.WEST, textField, 5, SpringLayout.EAST, label);
//    layout.putConstraint(SpringLayout.EAST, textField, 5, SpringLayout.EAST, contentPane);
    layout.putConstraint(SpringLayout.NORTH, textField, 5, SpringLayout.SOUTH, label);

    // Adjust constraints for the content pane: Its right
    // edge should be 5 pixels beyond the text field's right
    // edge, and its bottom edge should be 5 pixels beyond
    // the bottom edge of the tallest component (which we'll
    // assume is textField).
    layout.putConstraint(SpringLayout.EAST, contentPane, 5, SpringLayout.EAST, textField);
    layout.putConstraint(SpringLayout.SOUTH, contentPane, 5, SpringLayout.SOUTH, textField);

    // Display the window.
    frame.pack();
    frame.setVisible(true);
  }

  public static void main(String[] args)
  {
    // Schedule a job for the event-dispatching thread:
    // creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable()
    {
      public void run()
      {
        createAndShowGUI();
      }
    });
  }
}

根據我對 SpringLayout 要求的理解,我撰寫了以下內容:

import java.awt.Component;
import java.awt.LayoutManager;
import java.util.ArrayList;

import javax.swing.JPanel;
import javax.swing.SpringLayout;

import static javax.swing.SpringLayout.NORTH;
import static javax.swing.SpringLayout.EAST;
import static javax.swing.SpringLayout.SOUTH;
import static javax.swing.SpringLayout.WEST;

public class OneWidthPanel extends JPanel
{
  private static final long serialVersionUID = 1L;
  
  private int padding = 5;
  SpringLayout springLayout = new SpringLayout();
  
  public OneWidthPanel() { super(); setLayout(springLayout); }
  public OneWidthPanel(boolean isDoubleBuffered) { super(isDoubleBuffered); }
  public OneWidthPanel(LayoutManager layout) { throw new IllegalArgumentException("Cannot set a layout manager on the OneWidthPanel class"); }
  public OneWidthPanel(LayoutManager l, boolean isDoubleBuffered) { throw new IllegalArgumentException("Cannot set a layout manager on the OneWidthPanel class"); }
  
  private ArrayList<Component> componentList = new ArrayList<>();
  
  @Override
  public Component add(Component comp)
  {
    super.add(comp);
    
    componentList.add(comp);
    int listSize = componentList.size();
    
    String topConstraint;
    Component northComponent;
    if (listSize == 1)
    {
      topConstraint = NORTH;
      northComponent = this;
    }
    else
    {
      topConstraint = SOUTH;
      northComponent = componentList.get(listSize - 2);
    }

    springLayout.putConstraint(topConstraint, northComponent, padding, SpringLayout.NORTH, comp);
    springLayout.putConstraint(WEST, this, padding, WEST, comp);
    springLayout.putConstraint(EAST, this, padding, EAST, comp);
    
    return comp;
  }
  
  public void finishedAdding()
  {
    Component lastComponent = componentList.get(componentList.size()-1);
    springLayout.putConstraint(EAST,   this, padding, EAST,  lastComponent);
    springLayout.putConstraint(SOUTH,  this, padding, SOUTH, lastComponent);
  }
}

這是一個測驗它的小程式:

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JRadioButton;

import rcutil.layout.OneWidthPanel;

public class OneWidthPanelTester extends JFrame
{
  private static final long serialVersionUID = 1L;

  public static void main(String[] args)
  {
    OneWidthPanelTester tester = new OneWidthPanelTester();
    tester.go();
  }
  
  public void go()
  {
    OneWidthPanel panel = new OneWidthPanel();
    JButton button1 = new JButton("ONE new button");
    JButton button2 = new JButton("second b");
    JRadioButton rButton = new JRadioButton("choose me");
    
    panel.add(button1);
    panel.add(button2);
    panel.add(rButton);
    panel.finishedAdding();
    
    add(panel, BorderLayout.WEST);
    pack();
    setVisible(true);
  }

}

組件在面板頂部彼此重疊顯示。我想設定每個約束,當我添加它時,將每個組件的北端連接到前一個組件的南邊緣,將它們按照添加的順序垂直排列。正如https://docs.oracle.com/javase/tutorial/uiswing/layout/springfinishedAdding()上的“如何使用 SpringLayout”教程中所述,我有方法可以將最后一個組件與其容器的連接封裝起來。 html,并在我復制的演示程式中完成。

我不明白為什么我的組件相互重疊,但(兩個)演示組件垂直相鄰。我是否能夠滿足我最初的愿望,即讓垂直組件在面板中拉伸成相同的大小?

uj5u.com熱心網友回復:

你需要改變

springLayout.putConstraint(topConstraint, comp, padding, SpringLayout.NORTH, northComponent);

springLayout.putConstraint(NORTH, comp, padding, topConstraint, northComponent);

uj5u.com熱心網友回復:

正如 Hitesh 指出的那樣,您在add方法中將引數交換為 SpringLayout.putConstraints 。 該檔案指出:

 public void putConstraint(String e1,
                           Component c1,
                           int pad,
                           String e2,
                           Component c2)

引數:
e1 - 依賴的邊緣 - 依賴
c1的組件
pad- 依賴和錨點之間的固定距離
e2- 錨點的邊緣 - 錨點
c2的組件

前兩個引數是“從屬”,即您要定位的組件。最后兩個引數是“anchor”——即被定位的組件將依賴的另一個組件(或容器)。

但這不是問題的全部。要使所有組件具有相同的寬度,您需要使用使用Spring.max構建的Spring聚合它們的所有高度。

基于組件的Spring是一個“活動”物件:確切的最小值、首選值和最大值在相應組件中發生變化時都會發生變化。因此,所有這些基于組件的 Spring 物件的最大值將是您要應用于所有這些物件的寬度。

首先將組件的寬度保持在私有欄位中:

private Spring width = Spring.constant(0);

然后,在您的add方法中,您只需要一次呼叫putConstraints. 暫時不要附加組件的水平尺寸:

springLayout.putConstraint(NORTH, comp, padding, topConstraint, northComponent );
width = Spring.max(width, Spring.width(comp));

最后,在 中finishedAdding,使用那個“智能”Spring 作為容器的寬度和每個組件的寬度。

public void finishedAdding()
{
  Component lastComponent = componentList.get(componentList.size()-1);
  springLayout.putConstraint(EAST,   this, width,   WEST,  this);
  springLayout.putConstraint(SOUTH,  this, padding, SOUTH, lastComponent);

  // Make every component's width fill this container.
  for (Component comp : componentList) {
    springLayout.putConstraint(WEST, comp, 0, WEST, this);
    springLayout.putConstraint(EAST, comp, width, WEST, this);
  }
}

首先,我們將容器的寬度系結到所有組件的最大寬度(并將其高度系結到最后一個組件)。然后,為了確保每個組件都拉伸以填充容器的寬度,我們將其東側和西側都附加到容器上。

對于它的價值,您實際上并不需要 SpringLayout 。 Box可以做你想做的事,而不需要專門的課程:

JButton button1 = new JButton("ONE new button");
JButton button2 = new JButton("second b");
JRadioButton rButton = new JRadioButton("choose me");

int padding = 5;

Box panel = Box.createVerticalBox();
panel.add(button1);
panel.add(Box.createVerticalStrut(padding));
panel.add(button2);
panel.add(Box.createVerticalStrut(padding));
panel.add(rButton);

for (Component comp : panel.getComponents()) {
    Dimension size = comp.getMaximumSize();
    size.width = Integer.MAX_VALUE;
    comp.setMaximumSize(size);
}

uj5u.com熱心網友回復:

這是我最終想到的:

import static javax.swing.SpringLayout.EAST;
import static javax.swing.SpringLayout.NORTH;
import static javax.swing.SpringLayout.SOUTH;
import static javax.swing.SpringLayout.WEST;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.LayoutManager;
import java.util.ArrayList;

import javax.swing.BoxLayout;
import javax.swing.JPanel;
import javax.swing.SpringLayout;

public class OneWidthPanel extends JPanel
{
  private static final long serialVersionUID = 1L;
  
  private int padding = 5;
  SpringLayout springLayout = new SpringLayout();
  BoxLayout boxLayout = new BoxLayout(this, BoxLayout.PAGE_AXIS);
  
  public OneWidthPanel() 
  { 
    super();
    setLayout(springLayout);
  }
  public OneWidthPanel(boolean isDoubleBuffered) { super(isDoubleBuffered); }
  public OneWidthPanel(LayoutManager layout) { throw new IllegalArgumentException("Cannot set a layout manager on the OneWidthPanel class"); }
  public OneWidthPanel(LayoutManager l, boolean isDoubleBuffered) { throw new IllegalArgumentException("Cannot set a layout manager on the OneWidthPanel class"); }
  
  private ArrayList<Component> componentList = new ArrayList<>();
  
  @Override
  public Component add(Component comp)
  {
    super.add(comp);
    
    componentList.add(comp);
    int listSize = componentList.size();

    String topConstraint;
    Component northComponent;
    if (listSize == 1)
    {
      topConstraint = NORTH;
      northComponent = this;
    }
    else
    {
      topConstraint = SOUTH;
      northComponent = componentList.get(listSize - 2);
    }

    springLayout.putConstraint(NORTH, comp, padding, topConstraint, northComponent);
    springLayout.putConstraint(WEST, comp, padding, WEST, this);
//    springLayout.putConstraint(EAST, comp, padding, EAST, this);
    
    return comp;
  }
  
  public void finishedAdding()
  {
    Component lastComponent = componentList.get(componentList.size()-1);
//    springLayout.putConstraint(EAST,   this, padding, EAST,  lastComponent);
    springLayout.putConstraint(SOUTH,  this, padding, SOUTH, lastComponent);
    springLayout.putConstraint(WEST,   this, padding, WEST,  lastComponent);

    int maxComponentWidth = 0;
    int panelHeight = padding;
    
    // calculate overall height and maximum width
    for (Component component: componentList)
    {
      Dimension componentDimension = component.getPreferredSize();
      maxComponentWidth = Math.max(maxComponentWidth, componentDimension.width);
      panelHeight = panelHeight   componentDimension.height   padding;
    }
    
    // for each component, set the component width and preferred height,
    //    and set maximum width to MAX_VALUE; I was trying to get the components
    //    to stretch, but that doesn't work.
    for (Component component: componentList)
    {
      Dimension componentDimension = component.getPreferredSize();
      Dimension newD = new Dimension(maxComponentWidth, componentDimension.height);
//      Dimension maxD = new Dimension(Integer.MAX_VALUE, componentDimension.height);
      component.setPreferredSize(newD);
      component.setMinimumSize(newD);
      component.setMaximumSize(newD);
    }
    
    // set panel dimensions
    Dimension newD = new Dimension(maxComponentWidth   (padding*2), panelHeight);
    this.setPreferredSize(newD);
    this.setMinimumSize(newD);
  }
}

和當前的測驗人員:

import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

import rcutil.layout.OneWidthPanel;

public class OneWidthPanelTester extends JFrame implements Runnable
{
  private static final long serialVersionUID = 1L;

  public static void main(String[] args)
  {
    OneWidthPanelTester tester = new OneWidthPanelTester();
    SwingUtilities.invokeLater(tester);
  }
  
  public void run()
  {
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    
    JButton button1 = new JButton("ONE new button");
    JButton button2 = new JButton("second b");
    JRadioButton rButton = new JRadioButton("choose me");
    JLabel label = new JLabel("I'm last");
    label.setBorder(BorderFactory.createLineBorder(Color.black));
    JTextField textField = new JTextField(25);
    
    OneWidthPanel panel = new OneWidthPanel();
    panel.add(button1);
    panel.add(button2);
    panel.add(rButton);
    panel.add(label);
    panel.add(textField);
    panel.finishedAdding();
    
    add(panel, BorderLayout.CENTER);
    pack();
    setVisible(true);
  }

}

這些組件以添加到面板的最寬組件的寬度(按首選大小)顯示。按鈕不會隨面板拉伸,但文本欄位會 - 我曾認為設定按鈕的最大大小并添加和 EAST 方向約束會拉伸它們,但似乎沒有,而且我不需要這就是我現在正在做的事情。

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/429903.html

標籤:爪哇 摇摆 布局管理器 弹簧布局

上一篇:在JavaSwing(使用swingx)中,如何以與另一個表相同的順序對一個表中的行進行排序

下一篇:為什么從JFrame呼叫此JDialog時無法正確繪制?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more